From b6d05a08922675e9eb6f3a7e6192893069dde633 Mon Sep 17 00:00:00 2001 From: "kaf24@scramble.cl.cam.ac.uk" Date: Fri, 16 May 2003 09:35:50 +0000 Subject: [PATCH] bitkeeper revision 1.233 (3ec4b0f6Cj_75HMxVrjHKR0QUy_kNA) Many files: new file xenohead.def: change bean persistence from session to application Makefile: clean web/tmpl too xi_list: add raw integer state to output Many files: split for dual use: original command line invocation from domctl and new xenctl gui domctl: look for domctl.xml in /var/lib/xen domctl.xml: xi_tools_dir should come at the top build-dom.xml: remove silliness Makefile: add support for xenctl build-dom.xml: Rename: tools/control/build-domctl.xml -> tools/control/build-dom.xml build-domctl.xml: Rename: tools/control/build.xml -> tools/control/build-domctl.xml Many files: mvdir --- .rootkeys | 95 +++- tools/control/Makefile | 35 ++ .../build.xml => control/build-dom.xml} | 17 +- tools/control/build-xen.xml | 506 ++++++++++++++++++ tools/control/build.properties | 8 + tools/{domctl => control}/domctl | 2 +- tools/{domctl => control}/domctl.xml | 2 +- .../src/uk/ac/cam/cl/xeno/domctl/Command.java | 24 +- .../ac/cam/cl/xeno/domctl/CommandDestroy.java | 27 +- .../uk/ac/cam/cl/xeno/domctl/CommandHelp.java | 0 .../uk/ac/cam/cl/xeno/domctl/CommandList.java | 139 +++++ .../uk/ac/cam/cl/xeno/domctl/CommandNew.java | 76 ++- .../ac/cam/cl/xeno/domctl/CommandStart.java | 31 +- .../uk/ac/cam/cl/xeno/domctl/CommandStop.java | 30 +- .../uk/ac/cam/cl/xeno/domctl/Defaults.java | 72 ++- .../src/uk/ac/cam/cl/xeno/domctl/Domain.java | 27 + .../cl/xeno/domctl/InetAddressPattern.java | 0 .../src/uk/ac/cam/cl/xeno/domctl/Main.java | 3 +- .../uk/ac/cam/cl/xeno/domctl/Settings.java | 6 +- .../ac/cam/cl/xeno/domctl/StringPattern.java | 0 .../src/uk/ac/cam/cl/xeno/xenctl/Extent.java | 32 ++ .../src/uk/ac/cam/cl/xeno/xenctl/Library.java | 114 ++++ .../uk/ac/cam/cl/xeno/xenctl/Main.java.orig | 35 ++ .../src/uk/ac/cam/cl/xeno/xenctl/Mode.java | 22 + .../src/uk/ac/cam/cl/xeno/xenctl/Parser.java | 446 +++++++++++++++ .../uk/ac/cam/cl/xeno/xenctl/Partition.java | 125 +++++ .../cam/cl/xeno/xenctl/PartitionManager.java | 191 +++++++ .../uk/ac/cam/cl/xeno/xenctl/RootBean.java | 223 ++++++++ .../xeno/xenctl/SystemConfigurationBean.java | 30 ++ .../cl/xeno/xenctl/VirtualBlockDevice.java | 76 +++ .../uk/ac/cam/cl/xeno/xenctl/VirtualDisk.java | 257 +++++++++ .../cl/xeno/xenctl/VirtualDiskManager.java | 315 +++++++++++ .../src/uk/ac/cam/cl/xeno/xenctl/XML.java | 126 +++++ .../uk/ac/cam/cl/xeno/xenctl/XMLHelper.java | 205 +++++++ tools/control/web/WEB-INF/web.xml | 20 + tools/control/web/img/cambridge.gif | Bin 0 -> 1733 bytes tools/control/web/img/help.gif | Bin 0 -> 243 bytes tools/control/web/img/home.gif | Bin 0 -> 244 bytes tools/control/web/img/pixel.gif | Bin 0 -> 43 bytes tools/control/web/img/search.gif | Bin 0 -> 272 bytes tools/control/web/img/xeno.gif | Bin 0 -> 3600 bytes tools/control/web/tmpl/about.tmpl | 71 +++ tools/control/web/tmpl/dom-del.tmpl | 86 +++ tools/control/web/tmpl/dom-delr.tmpl | 42 ++ tools/control/web/tmpl/dom-lis.tmpl | 50 ++ tools/control/web/tmpl/dom-new.tmpl | 197 +++++++ tools/control/web/tmpl/dom-newr.tmpl | 100 ++++ tools/control/web/tmpl/dom-sta.tmpl | 64 +++ tools/control/web/tmpl/dom-star.tmpl | 40 ++ tools/control/web/tmpl/dom-stp.tmpl | 64 +++ tools/control/web/tmpl/dom-stpr.tmpl | 40 ++ tools/control/web/tmpl/dom.tmpl | 30 ++ tools/control/web/tmpl/dommenu.tmpl | 33 ++ tools/control/web/tmpl/help.tmpl | 61 +++ tools/control/web/tmpl/index.tmpl | 66 +++ tools/control/web/tmpl/install.pl | 236 ++++++++ tools/control/web/tmpl/makefile | 35 ++ tools/control/web/tmpl/newdom.tmpl | 172 ++++++ tools/control/web/tmpl/vd-fv.tmpl | 60 +++ tools/control/web/tmpl/vd-pa.tmpl | 97 ++++ tools/control/web/tmpl/vd-par.tmpl | 49 ++ tools/control/web/tmpl/vd-pv.tmpl | 54 ++ tools/control/web/tmpl/vd-vbdc.tmpl | 94 ++++ tools/control/web/tmpl/vd-vbdcr.tmpl | 44 ++ tools/control/web/tmpl/vd-vbdd.tmpl | 29 + tools/control/web/tmpl/vd-vbdf.tmpl | 59 ++ tools/control/web/tmpl/vd-vbdfr.tmpl | 32 ++ tools/control/web/tmpl/vd-vbdv.tmpl | 44 ++ tools/control/web/tmpl/vd-vdc.tmpl | 67 +++ tools/control/web/tmpl/vd-vdcr.tmpl | 64 +++ tools/control/web/tmpl/vd-vdd.tmpl | 58 ++ tools/control/web/tmpl/vd-vddr.tmpl | 34 ++ tools/control/web/tmpl/vd-vdr.tmpl | 83 +++ tools/control/web/tmpl/vd-vdrr.tmpl | 72 +++ tools/control/web/tmpl/vd-vdv.tmpl | 43 ++ tools/control/web/tmpl/vd.tmpl | 24 + tools/control/web/tmpl/vdmenu.tmpl | 63 +++ tools/control/web/tmpl/xenofoot.def | 28 + tools/control/web/tmpl/xenohead.def | 82 +++ tools/control/web/tmpl/xenostyle.css | 91 ++++ tools/domctl/Makefile | 9 - tools/internal/xi_helper | 15 + tools/internal/xi_list | 11 +- 83 files changed, 5896 insertions(+), 114 deletions(-) create mode 100644 tools/control/Makefile rename tools/{domctl/build.xml => control/build-dom.xml} (69%) create mode 100644 tools/control/build-xen.xml create mode 100644 tools/control/build.properties rename tools/{domctl => control}/domctl (94%) rename tools/{domctl => control}/domctl.xml (90%) rename tools/{domctl => control}/src/uk/ac/cam/cl/xeno/domctl/Command.java (69%) rename tools/{domctl => control}/src/uk/ac/cam/cl/xeno/domctl/CommandDestroy.java (75%) rename tools/{domctl => control}/src/uk/ac/cam/cl/xeno/domctl/CommandHelp.java (100%) create mode 100644 tools/control/src/uk/ac/cam/cl/xeno/domctl/CommandList.java rename tools/{domctl => control}/src/uk/ac/cam/cl/xeno/domctl/CommandNew.java (82%) rename tools/{domctl => control}/src/uk/ac/cam/cl/xeno/domctl/CommandStart.java (71%) rename tools/{domctl => control}/src/uk/ac/cam/cl/xeno/domctl/CommandStop.java (71%) rename tools/{domctl => control}/src/uk/ac/cam/cl/xeno/domctl/Defaults.java (73%) create mode 100644 tools/control/src/uk/ac/cam/cl/xeno/domctl/Domain.java rename tools/{domctl => control}/src/uk/ac/cam/cl/xeno/domctl/InetAddressPattern.java (100%) rename tools/{domctl => control}/src/uk/ac/cam/cl/xeno/domctl/Main.java (94%) rename tools/{domctl => control}/src/uk/ac/cam/cl/xeno/domctl/Settings.java (86%) rename tools/{domctl => control}/src/uk/ac/cam/cl/xeno/domctl/StringPattern.java (100%) create mode 100644 tools/control/src/uk/ac/cam/cl/xeno/xenctl/Extent.java create mode 100644 tools/control/src/uk/ac/cam/cl/xeno/xenctl/Library.java create mode 100644 tools/control/src/uk/ac/cam/cl/xeno/xenctl/Main.java.orig create mode 100644 tools/control/src/uk/ac/cam/cl/xeno/xenctl/Mode.java create mode 100644 tools/control/src/uk/ac/cam/cl/xeno/xenctl/Parser.java create mode 100644 tools/control/src/uk/ac/cam/cl/xeno/xenctl/Partition.java create mode 100644 tools/control/src/uk/ac/cam/cl/xeno/xenctl/PartitionManager.java create mode 100644 tools/control/src/uk/ac/cam/cl/xeno/xenctl/RootBean.java create mode 100644 tools/control/src/uk/ac/cam/cl/xeno/xenctl/SystemConfigurationBean.java create mode 100644 tools/control/src/uk/ac/cam/cl/xeno/xenctl/VirtualBlockDevice.java create mode 100644 tools/control/src/uk/ac/cam/cl/xeno/xenctl/VirtualDisk.java create mode 100644 tools/control/src/uk/ac/cam/cl/xeno/xenctl/VirtualDiskManager.java create mode 100644 tools/control/src/uk/ac/cam/cl/xeno/xenctl/XML.java create mode 100644 tools/control/src/uk/ac/cam/cl/xeno/xenctl/XMLHelper.java create mode 100644 tools/control/web/WEB-INF/web.xml create mode 100644 tools/control/web/img/cambridge.gif create mode 100644 tools/control/web/img/help.gif create mode 100644 tools/control/web/img/home.gif create mode 100644 tools/control/web/img/pixel.gif create mode 100644 tools/control/web/img/search.gif create mode 100644 tools/control/web/img/xeno.gif create mode 100644 tools/control/web/tmpl/about.tmpl create mode 100644 tools/control/web/tmpl/dom-del.tmpl create mode 100644 tools/control/web/tmpl/dom-delr.tmpl create mode 100644 tools/control/web/tmpl/dom-lis.tmpl create mode 100644 tools/control/web/tmpl/dom-new.tmpl create mode 100644 tools/control/web/tmpl/dom-newr.tmpl create mode 100644 tools/control/web/tmpl/dom-sta.tmpl create mode 100644 tools/control/web/tmpl/dom-star.tmpl create mode 100644 tools/control/web/tmpl/dom-stp.tmpl create mode 100644 tools/control/web/tmpl/dom-stpr.tmpl create mode 100644 tools/control/web/tmpl/dom.tmpl create mode 100644 tools/control/web/tmpl/dommenu.tmpl create mode 100644 tools/control/web/tmpl/help.tmpl create mode 100644 tools/control/web/tmpl/index.tmpl create mode 100755 tools/control/web/tmpl/install.pl create mode 100644 tools/control/web/tmpl/makefile create mode 100644 tools/control/web/tmpl/newdom.tmpl create mode 100644 tools/control/web/tmpl/vd-fv.tmpl create mode 100644 tools/control/web/tmpl/vd-pa.tmpl create mode 100644 tools/control/web/tmpl/vd-par.tmpl create mode 100644 tools/control/web/tmpl/vd-pv.tmpl create mode 100644 tools/control/web/tmpl/vd-vbdc.tmpl create mode 100644 tools/control/web/tmpl/vd-vbdcr.tmpl create mode 100644 tools/control/web/tmpl/vd-vbdd.tmpl create mode 100644 tools/control/web/tmpl/vd-vbdf.tmpl create mode 100644 tools/control/web/tmpl/vd-vbdfr.tmpl create mode 100644 tools/control/web/tmpl/vd-vbdv.tmpl create mode 100644 tools/control/web/tmpl/vd-vdc.tmpl create mode 100644 tools/control/web/tmpl/vd-vdcr.tmpl create mode 100644 tools/control/web/tmpl/vd-vdd.tmpl create mode 100644 tools/control/web/tmpl/vd-vddr.tmpl create mode 100644 tools/control/web/tmpl/vd-vdr.tmpl create mode 100644 tools/control/web/tmpl/vd-vdrr.tmpl create mode 100644 tools/control/web/tmpl/vd-vdv.tmpl create mode 100644 tools/control/web/tmpl/vd.tmpl create mode 100644 tools/control/web/tmpl/vdmenu.tmpl create mode 100644 tools/control/web/tmpl/xenofoot.def create mode 100644 tools/control/web/tmpl/xenohead.def create mode 100644 tools/control/web/tmpl/xenostyle.css delete mode 100644 tools/domctl/Makefile create mode 100755 tools/internal/xi_helper diff --git a/.rootkeys b/.rootkeys index f5abacd511..1f0ad21432 100644 --- a/.rootkeys +++ b/.rootkeys @@ -6,6 +6,85 @@ 3e6377b24eQqYMsDi9XrFkIgTzZ47A tools/balloon/Makefile 3e6377d6eiFjF1hHIS6JEIOFk62xSA tools/balloon/README 3e6377dbGcgnisKw16DPCaND7oGO3Q tools/balloon/balloon.c +3eb781edFwm_pW9FwnQACIe68viLOw tools/control/Makefile +3eb781fcTp_LPQwaot3SSSehkaf4eg tools/control/build-dom.xml +3ec41f7cWCxQ8pdH8ZWqhhv-38qQ1w tools/control/build-xen.xml +3ec41f7ca6IBXDSe0HVcMPp3PPloOQ tools/control/build.properties +3eb781fcXf-WczEdAhnTpWfbR55jqA tools/control/domctl +3eb781fcabCKRogwxJA3-jJKstw9Vg tools/control/domctl.xml +3eb781fcffCXkrcWLBxUTOfQFa3Saw tools/control/src/uk/ac/cam/cl/xeno/domctl/Command.java +3eb781fcOLcVAcqnZOAikur6sAP0rA tools/control/src/uk/ac/cam/cl/xeno/domctl/CommandDestroy.java +3eb781fcQuQVSKxKtp4fBgPOwx7DDw tools/control/src/uk/ac/cam/cl/xeno/domctl/CommandHelp.java +3ec41f7czS8UBqCsIi-nmojTBtg_iQ tools/control/src/uk/ac/cam/cl/xeno/domctl/CommandList.java +3eb781fcRYdxK1HbjBX7r7VlO5PS0w tools/control/src/uk/ac/cam/cl/xeno/domctl/CommandNew.java +3eb781fcbp9IAHTl40CoMavY1FNd_g tools/control/src/uk/ac/cam/cl/xeno/domctl/CommandStart.java +3eb781fdRXSsyEre7LxCmPJMpB5BaQ tools/control/src/uk/ac/cam/cl/xeno/domctl/CommandStop.java +3eb781fdX_thm9iHSxQ8vqQ0fL7Ncg tools/control/src/uk/ac/cam/cl/xeno/domctl/Defaults.java +3ec41f7cALw7QY_whiAsucUUb006Gg tools/control/src/uk/ac/cam/cl/xeno/domctl/Domain.java +3eb781fdTWJr8RPdfuG20IC0CzYL2A tools/control/src/uk/ac/cam/cl/xeno/domctl/InetAddressPattern.java +3eb781fdA8LFQEYE2fXg1JDB9OceYA tools/control/src/uk/ac/cam/cl/xeno/domctl/Main.java +3eb781fd_CgRvlaIBkJjxUSnuvCuHQ tools/control/src/uk/ac/cam/cl/xeno/domctl/Settings.java +3eb781fdFDS4lap1-3ZVDtbKZfpVZA tools/control/src/uk/ac/cam/cl/xeno/domctl/StringPattern.java +3ec41f7csVaMDEEUMZBotpSftCy0rg tools/control/src/uk/ac/cam/cl/xeno/xenctl/Extent.java +3ec41f7cO5uUI4qZmJ29jsammoZP4Q tools/control/src/uk/ac/cam/cl/xeno/xenctl/Library.java +3ec41f7civcv4mQiYK0DeX9Zvsxhrw tools/control/src/uk/ac/cam/cl/xeno/xenctl/Main.java.orig +3ec41f7dOVcHj4xU3BFut_einNzj6A tools/control/src/uk/ac/cam/cl/xeno/xenctl/Mode.java +3ec41f7d3-xTeoVJBJqWqxVfU-ANoQ tools/control/src/uk/ac/cam/cl/xeno/xenctl/Parser.java +3ec41f7dnnLe-6h-XWIvQVoP9oZu_A tools/control/src/uk/ac/cam/cl/xeno/xenctl/Partition.java +3ec41f7dD8h6MGxKTPtKzXPdGJS7bw tools/control/src/uk/ac/cam/cl/xeno/xenctl/PartitionManager.java +3ec41f7dOVZgjP4sQS6vjuBnExdlMQ tools/control/src/uk/ac/cam/cl/xeno/xenctl/RootBean.java +3ec41f7dvPdszb0frNEkMnEdJUBVjA tools/control/src/uk/ac/cam/cl/xeno/xenctl/SystemConfigurationBean.java +3ec41f7dlW5Buk3MO18HHtBax1Jz9g tools/control/src/uk/ac/cam/cl/xeno/xenctl/VirtualBlockDevice.java +3ec41f7dP3VglJUTuP45rwvSAoW_pg tools/control/src/uk/ac/cam/cl/xeno/xenctl/VirtualDisk.java +3ec41f7d8_ZsS9JjYQq861OFAZS9GA tools/control/src/uk/ac/cam/cl/xeno/xenctl/VirtualDiskManager.java +3ec41f7dSJieScU3uvPMGXk-8NgHvA tools/control/src/uk/ac/cam/cl/xeno/xenctl/XML.java +3ec41f7dGO96BS8-6FWGDjCxjncOGg tools/control/src/uk/ac/cam/cl/xeno/xenctl/XMLHelper.java +3ec41f7dO6IuKGGLG4VRUhMDmkTn5g tools/control/web/WEB-INF/web.xml +3ec41f7dRAPXBA0jQUd1k6MB3xVidg tools/control/web/img/cambridge.gif +3ec41f7dvxVe1Vb3kVOLZcN5Jra2tQ tools/control/web/img/help.gif +3ec41f7dJYExm-ityN2SgVVaeR_BYA tools/control/web/img/home.gif +3ec41f7d4IYjCuVYWjgq-OCue4O0Vw tools/control/web/img/pixel.gif +3ec41f7dW6Rxbc2h5vulWqEkj0rMzA tools/control/web/img/search.gif +3ec41f7d-WawzXt-iMiQON6VVF0d6Q tools/control/web/img/xeno.gif +3ec41f7d6gAIVIeI6d36osnxPNIbEw tools/control/web/tmpl/about.tmpl +3ec41f7dU7BdfMqTjNuI2yFIE9YTxQ tools/control/web/tmpl/dom-del.tmpl +3ec41f7dnAVr1lPsPDV0cwNe-cDiSw tools/control/web/tmpl/dom-delr.tmpl +3ec41f7dKNiNO7usbqUVaXvZafVzSg tools/control/web/tmpl/dom-lis.tmpl +3ec41f7dJ4oF7TdF8c858DgzXAPJUA tools/control/web/tmpl/dom-new.tmpl +3ec41f7dPelejfeiuXzFeETZXtYY3g tools/control/web/tmpl/dom-newr.tmpl +3ec41f7deN7cXpkmKhmp9nGMWtQ9Yw tools/control/web/tmpl/dom-sta.tmpl +3ec41f7dFl7cFsLVTEu06abaLjrh7A tools/control/web/tmpl/dom-star.tmpl +3ec41f7dOyejg7nsGjHhwS9dRwuwJQ tools/control/web/tmpl/dom-stp.tmpl +3ec41f7d-jdCAs49yO8mmvGdbVnFcQ tools/control/web/tmpl/dom-stpr.tmpl +3ec41f7d2S1JM6utrcajiWWmPi85TA tools/control/web/tmpl/dom.tmpl +3ec41f7dPyCkHbXAufQ0Nxnvhq7XpQ tools/control/web/tmpl/dommenu.tmpl +3ec41f7dZRDqKe8wk__95ztDQmaAOA tools/control/web/tmpl/help.tmpl +3ec41f7eTqbaFqMGU7lJG09vlEt0TQ tools/control/web/tmpl/index.tmpl +3ec41f7ed6_QZ1mg0vuA9Xu1wu1plw tools/control/web/tmpl/install.pl +3ec41f7emmAnjM4gsW6JWkqsjfi4Rg tools/control/web/tmpl/makefile +3ec41f7eGeQD-tCpxZNxNVcnKt6HfA tools/control/web/tmpl/newdom.tmpl +3ec41f7eoDHD2raa4x6dBINr4QLO3A tools/control/web/tmpl/vd-fv.tmpl +3ec41f7eawycxV05Ow3LfZtOlHZJPA tools/control/web/tmpl/vd-pa.tmpl +3ec41f7ef4mVT4vwOEL40MKIzS4EeA tools/control/web/tmpl/vd-par.tmpl +3ec41f7e1-bFRAfSveBhJNc-yQguXQ tools/control/web/tmpl/vd-pv.tmpl +3ec41f7e6v7MAKuV03qkOLX94vCGQg tools/control/web/tmpl/vd-vbdc.tmpl +3ec41f7eInaxQyoN0zPtGH6O1l0qaA tools/control/web/tmpl/vd-vbdcr.tmpl +3ec41f7e6vb1amZZa0IBdsPkPURj8Q tools/control/web/tmpl/vd-vbdd.tmpl +3ec41f7e678cIPHf9EjP5W6hVcssYA tools/control/web/tmpl/vd-vbdf.tmpl +3ec41f7e0PF1fM5WdSWxgtzcWTV__w tools/control/web/tmpl/vd-vbdfr.tmpl +3ec41f7eSe6rb0p4IxLU16czqIaTCA tools/control/web/tmpl/vd-vbdv.tmpl +3ec41f7eAYtNdK1Yy-RdGMCcSDNfBA tools/control/web/tmpl/vd-vdc.tmpl +3ec41f7eFxwTmuQ8wWMdvVQ5jtiKKA tools/control/web/tmpl/vd-vdcr.tmpl +3ec41f7e2osvqR4HUXCd9zUIIvUjaA tools/control/web/tmpl/vd-vdd.tmpl +3ec41f7e_TlFUNtMUUk1vivYx-4M2w tools/control/web/tmpl/vd-vddr.tmpl +3ec41f7eqey0GnU2CvlvO0OvX0Pmgg tools/control/web/tmpl/vd-vdr.tmpl +3ec41f7elad0gJQYmWPOikqUUKkMtA tools/control/web/tmpl/vd-vdrr.tmpl +3ec41f7eQ2vdTzXZAbxIWCosxZHJkg tools/control/web/tmpl/vd-vdv.tmpl +3ec41f7estxrL28BGG8obBnzt-SiAA tools/control/web/tmpl/vd.tmpl +3ec41f7e6SAwV8ebs9Be7zV2LV92oQ tools/control/web/tmpl/vdmenu.tmpl +3ec41f7ecn3uvsSrOVxKC8G8ACuulg tools/control/web/tmpl/xenofoot.def +3ec41f7ek1RffqN2yRUzSTkD5m1J6w tools/control/web/tmpl/xenohead.def +3ec41f7e1ZpfCsgQ2qRJBooBn_iRtA tools/control/web/tmpl/xenostyle.css 3e4d00468-FN2VDeEHo96zxrMHK_mA tools/domain_builder/Makefile 3e4d0046SPau_y0sw2WLJz8QkqNoRA tools/domain_builder/README 3e4d0046bbdH0GsI9J_1Eb4ZQHfIiQ tools/domain_builder/dom0_defs.h @@ -17,21 +96,6 @@ 3e71afadoAI0VvAGKebLpToVQxUKfQ tools/domain_builder/mynewdom 3e4d0046VHhXwFuG5FK34AVxqd5A_A tools/domain_builder/newdom 3e4d0046IBzDIeaMbQB-e2QB2ahbig tools/domain_builder/vifinit -3eb781edFwm_pW9FwnQACIe68viLOw tools/domctl/Makefile -3eb781fcTp_LPQwaot3SSSehkaf4eg tools/domctl/build.xml -3eb781fcXf-WczEdAhnTpWfbR55jqA tools/domctl/domctl -3eb781fcabCKRogwxJA3-jJKstw9Vg tools/domctl/domctl.xml -3eb781fcffCXkrcWLBxUTOfQFa3Saw tools/domctl/src/uk/ac/cam/cl/xeno/domctl/Command.java -3eb781fcOLcVAcqnZOAikur6sAP0rA tools/domctl/src/uk/ac/cam/cl/xeno/domctl/CommandDestroy.java -3eb781fcQuQVSKxKtp4fBgPOwx7DDw tools/domctl/src/uk/ac/cam/cl/xeno/domctl/CommandHelp.java -3eb781fcRYdxK1HbjBX7r7VlO5PS0w tools/domctl/src/uk/ac/cam/cl/xeno/domctl/CommandNew.java -3eb781fcbp9IAHTl40CoMavY1FNd_g tools/domctl/src/uk/ac/cam/cl/xeno/domctl/CommandStart.java -3eb781fdRXSsyEre7LxCmPJMpB5BaQ tools/domctl/src/uk/ac/cam/cl/xeno/domctl/CommandStop.java -3eb781fdX_thm9iHSxQ8vqQ0fL7Ncg tools/domctl/src/uk/ac/cam/cl/xeno/domctl/Defaults.java -3eb781fdTWJr8RPdfuG20IC0CzYL2A tools/domctl/src/uk/ac/cam/cl/xeno/domctl/InetAddressPattern.java -3eb781fdA8LFQEYE2fXg1JDB9OceYA tools/domctl/src/uk/ac/cam/cl/xeno/domctl/Main.java -3eb781fd_CgRvlaIBkJjxUSnuvCuHQ tools/domctl/src/uk/ac/cam/cl/xeno/domctl/Settings.java -3eb781fdFDS4lap1-3ZVDtbKZfpVZA tools/domctl/src/uk/ac/cam/cl/xeno/domctl/StringPattern.java 3eb781fdl4lXWYZzmqDDUAYhAThRqQ tools/internal/Makefile 3eb781fdc539MQQm47rYRCCR3N5i-Q tools/internal/dom0_defs.h 3eb781fdEYILyFg60YVBsWNqxWFf1g tools/internal/dom0_ops.h @@ -40,6 +104,7 @@ 3eb781fdgbSkh2O6JQS-65Dz4n0ItQ tools/internal/xi_build.c 3eb781fdW1SAyiaC4mTsXq_9fRHh-A tools/internal/xi_create.c 3eb781fdcJ0fF7rWfzAOArW-x4-gwA tools/internal/xi_destroy.c +3ec43c5dmQxGDvgJJXbV1yLxT30Y1A tools/internal/xi_helper 3eb83c3bZeECmphOKOJxSu4Lo1LpBw tools/internal/xi_list 3eb781fd8oRfPgH7qTh7xvgmwD6NgA tools/internal/xi_start.c 3eb781fd0Eo9K1jEFCSAVzO51i_ngg tools/internal/xi_stop.c diff --git a/tools/control/Makefile b/tools/control/Makefile new file mode 100644 index 0000000000..f78d796d65 --- /dev/null +++ b/tools/control/Makefile @@ -0,0 +1,35 @@ +default: domctl xenctl + +install: install-domctl install-xenctl + +clean: clean-domctl clean-xenctl + + + +domctl: FORCE + ant -buildfile build-dom.xml dist + +install-domctl: domctl + cp domctl.jar domctl ../../../install/bin + chmod 755 ../../../install/bin/domctl + +clean-domctl: + ant -buildfile build-dom.xml clean + rm -f domctl.jar + + + +xenctl: FORCE + (cd web/tmpl; make) + ant -buildfile build-xen.xml dist + +install-xenctl: xenctl + -ant -buildfile build-xen.xml remove + ant -buildfile build-xen.xml install + +clean-xenctl: + (cd web/tmpl; make clean) + ant -buildfile build-xen.xml clean + rm -f xenctl.jar + +FORCE: diff --git a/tools/domctl/build.xml b/tools/control/build-dom.xml similarity index 69% rename from tools/domctl/build.xml rename to tools/control/build-dom.xml index 88d5ffb5b5..eaf7380f0c 100644 --- a/tools/domctl/build.xml +++ b/tools/control/build-dom.xml @@ -1,8 +1,6 @@ - - - + @@ -10,17 +8,23 @@ - + + + - + + + - + + + @@ -40,6 +44,5 @@ - \ No newline at end of file diff --git a/tools/control/build-xen.xml b/tools/control/build-xen.xml new file mode 100644 index 0000000000..7f7a9b3dfb --- /dev/null +++ b/tools/control/build-xen.xml @@ -0,0 +1,506 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + all clean, them compile + dist create war file + install install application in servlet container + list list applications installed in servelet container + reload reload application in servlet container + remove dynamically remove web application + + + diff --git a/tools/control/build.properties b/tools/control/build.properties new file mode 100644 index 0000000000..9e375cbfdc --- /dev/null +++ b/tools/control/build.properties @@ -0,0 +1,8 @@ +catalina.home=/anfs/scratch/labyrinth/ach61/jakarta-tomcat-4.1.24 +manager.url=http://mousetrap-0.xeno.cl.cam.ac.uk:80/manager +manager.username=hobbes +manager.password=tiger +compile.optimize=false +build.home=/anfs/scratch/labyrinth/ach61/xeno-clone/xeno.bk/tools/control/build-xen +app.name=xenctl + diff --git a/tools/domctl/domctl b/tools/control/domctl similarity index 94% rename from tools/domctl/domctl rename to tools/control/domctl index 9383512f2d..959f0cee75 100755 --- a/tools/domctl/domctl +++ b/tools/control/domctl @@ -1,7 +1,7 @@ #!/bin/bash if [ -z "$DEFAULTS_FILE" ] ; then DEFAULTS_FILE=domctl.xml ; fi -if [ -z "$DEFAULTS_PATH" ] ; then DEFAULTS_PATH=.:/etc ; fi +if [ -z "$DEFAULTS_PATH" ] ; then DEFAULTS_PATH=.:/etc:/var/lib/xen ; fi if [ -z "$QUERY_DEV" ] ; then QUERY_DEV=eth0 ; fi if [ -z "$IFCONFIG" ] ; then IFCONFIG=/sbin/ifconfig ; fi if [ -z "$ROUTE" ] ; then ROUTE=/sbin/route ; fi diff --git a/tools/domctl/domctl.xml b/tools/control/domctl.xml similarity index 90% rename from tools/domctl/domctl.xml rename to tools/control/domctl.xml index bfca3cf549..77bd5dcc7e 100644 --- a/tools/domctl/domctl.xml +++ b/tools/control/domctl.xml @@ -1,5 +1,6 @@ +/usr/local/bin/ XenoLinux 16000 ./image @@ -11,5 +12,4 @@ 128.232.32.20 /usr/groups/srgboot/moonraider/roots/root+ 10 -/tools/internal/ diff --git a/tools/domctl/src/uk/ac/cam/cl/xeno/domctl/Command.java b/tools/control/src/uk/ac/cam/cl/xeno/domctl/Command.java similarity index 69% rename from tools/domctl/src/uk/ac/cam/cl/xeno/domctl/Command.java rename to tools/control/src/uk/ac/cam/cl/xeno/domctl/Command.java index b667e3f274..29113b534a 100644 --- a/tools/domctl/src/uk/ac/cam/cl/xeno/domctl/Command.java +++ b/tools/control/src/uk/ac/cam/cl/xeno/domctl/Command.java @@ -46,29 +46,31 @@ public abstract class Command return result; } - public int reportXIError (String message, String cmd_array[]) + public String reportXIError (String message, String cmd_array[]) { + StringBuffer sb = new StringBuffer(); int i; - System.err.print (message + " using: "); + sb.append (message + " using: "); for (i = 0; i < cmd_array.length; i ++) { - System.err.print (cmd_array[i] + " "); + sb.append (cmd_array[i] + " "); } - System.err.println(); - return -1; + sb.append (System.getProperty("line.separator")); + return sb.toString(); } - public int reportError (String message) + public String reportError (String message) { - System.err.println (message); - return -1; + return (message); } - public void reportCommand (String cmd_array[]) + public String reportCommand (String cmd_array[]) { + StringBuffer sb = new StringBuffer(); int i; for (i = 0; i < cmd_array.length; i ++) { - System.out.print (cmd_array[i] + " "); + sb.append (cmd_array[i] + " "); } - System.out.println(); + sb.append (System.getProperty("line.separator")); + return sb.toString(); } } diff --git a/tools/domctl/src/uk/ac/cam/cl/xeno/domctl/CommandDestroy.java b/tools/control/src/uk/ac/cam/cl/xeno/domctl/CommandDestroy.java similarity index 75% rename from tools/domctl/src/uk/ac/cam/cl/xeno/domctl/CommandDestroy.java rename to tools/control/src/uk/ac/cam/cl/xeno/domctl/CommandDestroy.java index 025f373c50..68ea270a5d 100644 --- a/tools/domctl/src/uk/ac/cam/cl/xeno/domctl/CommandDestroy.java +++ b/tools/control/src/uk/ac/cam/cl/xeno/domctl/CommandDestroy.java @@ -7,10 +7,10 @@ public class CommandDestroy extends Command { public int doCommand(Defaults d, String args[]) { - Runtime r = Runtime.getRuntime (); int domain_id = getIntParameter(args, 'n', 0); boolean force = getFlagParameter(args, 'f'); int rc = 0; + String output; if (domain_id == 0) { System.err.println ("Expected -n"); @@ -18,6 +18,23 @@ public class CommandDestroy extends Command return rc; } + output = executeCommand(d, domain_id, force); + if (output != null) + { + System.err.println(output); + return -1; + } + return 0; + } + + public String + executeCommand(Defaults d, + int domain_id, + boolean force) + { + Runtime r = Runtime.getRuntime (); + String output = null; + try { Process destroy_p; @@ -31,7 +48,7 @@ public class CommandDestroy extends Command destroy_cmdarray[idx++] = "" + domain_id; if (Settings.TEST) { - reportCommand (destroy_cmdarray); + output += reportCommand (destroy_cmdarray); } else { destroy_p = r.exec (destroy_cmdarray); destroy_rc = destroy_p.waitFor (); @@ -43,12 +60,10 @@ public class CommandDestroy extends Command } catch (Exception e) { - System.err.println ("Could not destroy domain (" + e + ")"); - e.printStackTrace (); - rc = -1; + return ("Could not destroy domain (" + e + ")"); } - return rc; + return output; } public String getName() diff --git a/tools/domctl/src/uk/ac/cam/cl/xeno/domctl/CommandHelp.java b/tools/control/src/uk/ac/cam/cl/xeno/domctl/CommandHelp.java similarity index 100% rename from tools/domctl/src/uk/ac/cam/cl/xeno/domctl/CommandHelp.java rename to tools/control/src/uk/ac/cam/cl/xeno/domctl/CommandHelp.java diff --git a/tools/control/src/uk/ac/cam/cl/xeno/domctl/CommandList.java b/tools/control/src/uk/ac/cam/cl/xeno/domctl/CommandList.java new file mode 100644 index 0000000000..522effa3a6 --- /dev/null +++ b/tools/control/src/uk/ac/cam/cl/xeno/domctl/CommandList.java @@ -0,0 +1,139 @@ +package uk.ac.cam.cl.xeno.domctl; + +import java.io.*; +import java.net.*; +import java.util.Vector; +import java.util.StringTokenizer; + +public class CommandList extends Command +{ + public int doCommand(Defaults d, String args[]) + { + Domain [] domains = executeCommand(d); + + for (int loop = 0; loop < domains.length; loop++) + { + System.out.println ("id: " + domains[loop].id + + " (" + domains[loop].name+ ")"); + System.out.println (" processor: " + domains[loop].processor); + System.out.println (" has cpu: " + domains[loop].cpu); + System.out.println (" state: " + domains[loop].nstate + " " + + domains[loop].state); + System.out.println (" mcu advance: " + domains[loop].mcu); + System.out.println (" total pages: " + domains[loop].pages); + } + + return 0; + } + + public Domain[] + executeCommand(Defaults d) + { + Runtime r = Runtime.getRuntime (); + int rc = 0; + Vector v = new Vector(); + String outline; + BufferedReader in; + Domain[] array; + String output = null; + + try + { + Process start_p; + String start_cmdarray[] = new String[1]; + int start_rc; + start_cmdarray[0] = d.XIToolsDir + "xi_list"; + + if (Settings.TEST) { + output += reportCommand (start_cmdarray); + } else { + start_p = r.exec (start_cmdarray); + start_rc = start_p.waitFor (); + if (start_rc != 0) { + return null; + } + + in = new BufferedReader( + new InputStreamReader(start_p.getInputStream())); + + outline = in.readLine(); + while (outline != null) + { + Domain domain = new Domain(); + + StringTokenizer st = new StringTokenizer(outline); + if (st.hasMoreTokens()) + { + domain.id = Integer.parseInt(st.nextToken()); + } + if (st.hasMoreTokens()) + { + domain.processor = Integer.parseInt(st.nextToken()); + } + if (st.hasMoreTokens()) + { + if (st.nextToken().equals("1")) + { + domain.cpu = true; + } + else + { + domain.cpu = false; + } + } + if (st.hasMoreTokens()) + { + domain.nstate = Integer.parseInt(st.nextToken()); + } + if (st.hasMoreTokens()) + { + domain.state = st.nextToken().toLowerCase(); + } + if (st.hasMoreTokens()) + { + domain.mcu = Integer.parseInt(st.nextToken()); + } + if (st.hasMoreTokens()) + { + domain.pages = Integer.parseInt(st.nextToken()); + } + if (st.hasMoreTokens()) + { + domain.name = st.nextToken(); + } + + v.add(domain); + + outline = in.readLine(); + } + + } + } + catch (Exception e) + { + System.err.println ("Could not get domain list(" + e + ")"); + e.printStackTrace (); + return null; + } + + array = new Domain[v.size()]; + v.toArray(array); + return array; + } + + public String getName() + { + return "list"; + } + + public String getUsage() + { + return ""; + } + + public String getHelpText() + { + return + "List domain information"; + } +} diff --git a/tools/domctl/src/uk/ac/cam/cl/xeno/domctl/CommandNew.java b/tools/control/src/uk/ac/cam/cl/xeno/domctl/CommandNew.java similarity index 82% rename from tools/domctl/src/uk/ac/cam/cl/xeno/domctl/CommandNew.java rename to tools/control/src/uk/ac/cam/cl/xeno/domctl/CommandNew.java index cc5e782196..e52f4584f0 100644 --- a/tools/domctl/src/uk/ac/cam/cl/xeno/domctl/CommandNew.java +++ b/tools/control/src/uk/ac/cam/cl/xeno/domctl/CommandNew.java @@ -8,7 +8,6 @@ public class CommandNew extends Command { public int doCommand(Defaults d, String args[]) { - Runtime r = Runtime.getRuntime (); String name = getStringParameter(args, 'n', d.domainName); int size = getIntParameter(args, 'k', d.domainSizeKB); String image = getStringParameter(args, 'i', d.domainImage); @@ -22,16 +21,50 @@ public class CommandNew extends Command String nw_mask = getStringParameter (args, 'm', d.NWMask); String nw_nfs_server = getStringParameter (args, 's', d.NWNFSServer); String nw_host = getStringParameter (args, 'h', d.NWHost); - String domain_ip = ""; - int rc = 0; + String output; + + d.describe (); + + output = executeCommand(d, name, size, image, initrd, vifs, + bargs, root_dev, nfs_root_path, + nw_ip, nw_gw, nw_mask, nw_nfs_server, nw_host); + if (output != null) + { + System.err.println(output); + return -1; + } + return 0; + } + + public String + executeCommand(Defaults d, + String name, + int size, + String image, + String initrd, + int vifs, + String bargs, + String root_dev, + String nfs_root_path, + String nw_ip, + String nw_gw, + String nw_mask, + String nw_nfs_server, + String nw_host) + { + Runtime r = Runtime.getRuntime (); int domain_id = -1; - DataInputStream dis; + BufferedReader br; int idx; int i; File image_tmp = null; File initrd_tmp = null; + String domain_ip = ""; + String output = ""; - d.describe (); + String create_cmdarray[] = new String[3]; + String build_cmdarray[] = new String[6]; + String vifinit_cmdarray[] = new String[4]; try { @@ -55,7 +88,6 @@ public class CommandNew extends Command /* Create a new empty domain */ Process create_p; - String create_cmdarray[] = new String[3]; int create_rc; create_cmdarray[0] = d.XIToolsDir + "xi_create"; create_cmdarray[1] = "" + size; @@ -66,13 +98,14 @@ public class CommandNew extends Command create_rc=0; } else { create_p = r.exec (create_cmdarray); - dis = new DataInputStream (new BufferedInputStream (create_p.getInputStream ())); - domain_id = Integer.parseInt (dis.readLine ()); + br = new BufferedReader ( + new InputStreamReader (create_p.getInputStream ())); + domain_id = Integer.parseInt (br.readLine ()); create_rc = create_p.waitFor (); } if (create_rc != 0) { - return reportXIError ("Failed to create domain", create_cmdarray); + return reportXIError("Failed to create domain", create_cmdarray); } else if (domain_id > d.MaxDomainNumber) { return reportError ("Cannot configure more than " + d.MaxDomainNumber + " domains"); @@ -90,12 +123,12 @@ public class CommandNew extends Command return reportError ("No NFS server specified"); } bargs = (bargs + - "root=/dev/nfs " + + " root=/dev/nfs " + "nfsroot=" + StringPattern.parse(nfs_root_path).resolve(domain_id) + " "); } else { bargs = (bargs + - "root=" + StringPattern.parse(root_dev).resolve(domain_id) + + " root=" + StringPattern.parse(root_dev).resolve(domain_id) + " "); } @@ -120,7 +153,6 @@ public class CommandNew extends Command /* Build the domain */ Process build_p; - String build_cmdarray[] = new String[6]; int build_rc; idx = 0; for (i = 0; i < build_cmdarray.length; i ++) @@ -147,7 +179,6 @@ public class CommandNew extends Command /* Set up the first VIF if necessary */ if (vifs > 0) { Process vifinit_p; - String vifinit_cmdarray[] = new String[4]; int vifinit_rc; vifinit_cmdarray[0] = d.XIToolsDir + "xi_vifinit"; vifinit_cmdarray[1] = "" + domain_id; @@ -172,16 +203,21 @@ public class CommandNew extends Command } catch (Exception e) { - System.err.println ("Could not create new domain (" + e + ")"); - e.printStackTrace (); - rc = -1; + e.printStackTrace(); + return ("Could not create new domain (" + e + ")"); } - if (rc == 0) { - System.out.println ("Created domain " + domain_id); - } + output += "\ndomain created with arguments:
\n"; + for (i = 0; i < create_cmdarray.length; i ++) + output += create_cmdarray[i] + "
"; + output += "\ndomain built with arguments:
\n"; + for (i = 0; i < build_cmdarray.length; i ++) + output += build_cmdarray[i] + "
"; + output += "\nVIF 0 initialized with arguments:
\n"; + for (i = 0; i < vifinit_cmdarray.length; i ++) + output += vifinit_cmdarray[i] + "
"; - return rc; + return output; } File getUncompressed (String prefix, String original) throws IOException { diff --git a/tools/domctl/src/uk/ac/cam/cl/xeno/domctl/CommandStart.java b/tools/control/src/uk/ac/cam/cl/xeno/domctl/CommandStart.java similarity index 71% rename from tools/domctl/src/uk/ac/cam/cl/xeno/domctl/CommandStart.java rename to tools/control/src/uk/ac/cam/cl/xeno/domctl/CommandStart.java index b84b66d306..0a5141efe9 100644 --- a/tools/domctl/src/uk/ac/cam/cl/xeno/domctl/CommandStart.java +++ b/tools/control/src/uk/ac/cam/cl/xeno/domctl/CommandStart.java @@ -7,16 +7,31 @@ public class CommandStart extends Command { public int doCommand(Defaults d, String args[]) { - Runtime r = Runtime.getRuntime (); int domain_id = getIntParameter(args, 'n', 0); - int rc = 0; + String output; if (domain_id == 0) { System.err.println ("Expected -n"); - rc = -1; - return rc; + return -1; + } + + output = executeCommand(d, domain_id); + if (output != null) + { + System.err.println(output); + return -1; } + return 0; + } + + + public String + executeCommand(Defaults d, int domain_id) + { + Runtime r = Runtime.getRuntime (); + String output = null; + try { Process start_p; @@ -26,7 +41,7 @@ public class CommandStart extends Command start_cmdarray[1] = "" + domain_id; if (Settings.TEST) { - reportCommand (start_cmdarray); + output += reportCommand (start_cmdarray); } else { start_p = r.exec (start_cmdarray); start_rc = start_p.waitFor (); @@ -37,12 +52,10 @@ public class CommandStart extends Command } catch (Exception e) { - System.err.println ("Could not start new domain (" + e + ")"); - e.printStackTrace (); - rc = -1; + return ("Could not start new domain (" + e + ")"); } - return rc; + return output; } public String getName() diff --git a/tools/domctl/src/uk/ac/cam/cl/xeno/domctl/CommandStop.java b/tools/control/src/uk/ac/cam/cl/xeno/domctl/CommandStop.java similarity index 71% rename from tools/domctl/src/uk/ac/cam/cl/xeno/domctl/CommandStop.java rename to tools/control/src/uk/ac/cam/cl/xeno/domctl/CommandStop.java index c6b4cadd6c..ffee1efd2d 100644 --- a/tools/domctl/src/uk/ac/cam/cl/xeno/domctl/CommandStop.java +++ b/tools/control/src/uk/ac/cam/cl/xeno/domctl/CommandStop.java @@ -7,15 +7,29 @@ public class CommandStop extends Command { public int doCommand(Defaults d, String args[]) { - Runtime r = Runtime.getRuntime (); int domain_id = getIntParameter(args, 'n', 0); - int rc = 0; + String output; if (domain_id == 0) { System.err.println ("Expected -n"); - rc = -1; - return rc; + return -1; + } + + output = executeCommand(d, domain_id); + if (output != null) + { + System.err.println(output); + return -1; } + return 0; + } + + public String + executeCommand(Defaults d, + int domain_id) + { + Runtime r = Runtime.getRuntime (); + String output = null; try { @@ -26,7 +40,7 @@ public class CommandStop extends Command stop_cmdarray[1] = "" + domain_id; if (Settings.TEST) { - reportCommand (stop_cmdarray); + output += reportCommand (stop_cmdarray); } else { stop_p = r.exec (stop_cmdarray); stop_rc = stop_p.waitFor (); @@ -38,12 +52,10 @@ public class CommandStop extends Command } catch (Exception e) { - System.err.println ("Could not stop new domain (" + e + ")"); - e.printStackTrace (); - rc = -1; + return ("Could not stop new domain (" + e + ")"); } - return rc; + return output; } public String getName() diff --git a/tools/domctl/src/uk/ac/cam/cl/xeno/domctl/Defaults.java b/tools/control/src/uk/ac/cam/cl/xeno/domctl/Defaults.java similarity index 73% rename from tools/domctl/src/uk/ac/cam/cl/xeno/domctl/Defaults.java rename to tools/control/src/uk/ac/cam/cl/xeno/domctl/Defaults.java index 5ce360a5ad..9a2dc706ac 100644 --- a/tools/domctl/src/uk/ac/cam/cl/xeno/domctl/Defaults.java +++ b/tools/control/src/uk/ac/cam/cl/xeno/domctl/Defaults.java @@ -5,29 +5,31 @@ import java.io.*; import org.xml.sax.*; import org.xml.sax.helpers.*; +/* these values are used in xenctl & domctl, so they need to be public */ + public class Defaults { - String domainName; + public String domainName; - int domainSizeKB; - String domainImage; - String domainInitRD; - int domainVIFs; + public int domainSizeKB; + public String domainImage; + public String domainInitRD; + public int domainVIFs; - String rootDevice; + public String rootDevice; - String NWIP; - String NWGW; - String NWMask; - String NWHost; + public String NWIP; + public String NWGW; + public String NWMask; + public String NWHost; - String NWNFSServer; - String NWNFSRoot; + public String NWNFSServer; + public String NWNFSRoot; int MaxDomainNumber = Integer.MAX_VALUE; String args = ""; - String XIToolsDir; + public String XIToolsDir = ""; /***********************************************************************/ @@ -35,6 +37,11 @@ public class Defaults { File f = Settings.getDefaultsFile (); + if (f == null) + { + return; + } + try { XMLReader xr = new org.apache.crimson.parser.XMLReaderImpl(); @@ -48,7 +55,7 @@ public class Defaults System.err.println ("Could not read defaults file " + f + "\nException: " + e); e.printStackTrace(); - System.exit(1); + return; } } @@ -121,11 +128,11 @@ public class Defaults } else if (lastName.equals ("root_device")) { rootDevice = s; } else if (lastName.equals ("nw_ip")) { - NWIP = expandDefault (s, Settings.LOCAL_IP); + NWIP = expandDefault (s, runCommand(XIToolsDir+Settings.XI_HELPER+" ip").trim()); } else if (lastName.equals ("nw_gw")) { - NWGW = expandDefault (s, Settings.LOCAL_GW); + NWGW = expandDefault (s, runCommand(XIToolsDir+Settings.XI_HELPER+" route").trim()); } else if (lastName.equals ("nw_mask")) { - NWMask = expandDefault (s, Settings.LOCAL_MASK); + NWMask = expandDefault (s, runCommand(XIToolsDir+Settings.XI_HELPER+" mask").trim()); } else if (lastName.equals ("nw_host")) { NWHost = s; } else if (lastName.equals ("nw_nfs_server")) { @@ -155,4 +162,35 @@ public class Defaults return supplied; } } + + + public String + runCommand (String command) + { + Runtime runtime = Runtime.getRuntime(); + String outline; + StringBuffer output = new StringBuffer(); + + try + { + Process process = runtime.exec(command); + BufferedReader in = new BufferedReader( + new InputStreamReader(process.getInputStream())); + + outline = in.readLine(); + while (outline != null) + { + output.append("\n" + outline); + outline = in.readLine(); + } + } + catch (IOException e) + { + return e.toString(); + } + + return output.toString(); + } + + } diff --git a/tools/control/src/uk/ac/cam/cl/xeno/domctl/Domain.java b/tools/control/src/uk/ac/cam/cl/xeno/domctl/Domain.java new file mode 100644 index 0000000000..d84d9eaf7e --- /dev/null +++ b/tools/control/src/uk/ac/cam/cl/xeno/domctl/Domain.java @@ -0,0 +1,27 @@ +package uk.ac.cam.cl.xeno.domctl; + +public class +Domain +{ + public int id; /* domain id */ + public int processor; /* processor */ + public boolean cpu; /* has cpu */ + public int nstate; /* state */ + public String state; /* running, interruptable, uninterruptable, + wait, suspended, dying */ + public int mcu; /* mcu advances */ + public int pages; /* total pages */ + public String name; /* name */ + + Domain() + { + id = 0; + processor = 0; + cpu = false; + nstate = 0; + state = ""; + mcu = 0; + pages = 0; + name = "none"; + } +} diff --git a/tools/domctl/src/uk/ac/cam/cl/xeno/domctl/InetAddressPattern.java b/tools/control/src/uk/ac/cam/cl/xeno/domctl/InetAddressPattern.java similarity index 100% rename from tools/domctl/src/uk/ac/cam/cl/xeno/domctl/InetAddressPattern.java rename to tools/control/src/uk/ac/cam/cl/xeno/domctl/InetAddressPattern.java diff --git a/tools/domctl/src/uk/ac/cam/cl/xeno/domctl/Main.java b/tools/control/src/uk/ac/cam/cl/xeno/domctl/Main.java similarity index 94% rename from tools/domctl/src/uk/ac/cam/cl/xeno/domctl/Main.java rename to tools/control/src/uk/ac/cam/cl/xeno/domctl/Main.java index 49b4fb3c54..a4f74de535 100644 --- a/tools/domctl/src/uk/ac/cam/cl/xeno/domctl/Main.java +++ b/tools/control/src/uk/ac/cam/cl/xeno/domctl/Main.java @@ -7,7 +7,8 @@ public class Main static CommandStart start = new CommandStart (); static CommandStop stop = new CommandStop (); static CommandDestroy destroy = new CommandDestroy (); - static Command commands[] = { help, newdom, start, stop, destroy }; + static CommandList list = new CommandList (); + static Command commands[] = { help, newdom, start, stop, destroy, list }; public static void main (String[] args) { diff --git a/tools/domctl/src/uk/ac/cam/cl/xeno/domctl/Settings.java b/tools/control/src/uk/ac/cam/cl/xeno/domctl/Settings.java similarity index 86% rename from tools/domctl/src/uk/ac/cam/cl/xeno/domctl/Settings.java rename to tools/control/src/uk/ac/cam/cl/xeno/domctl/Settings.java index 13d1a2d1df..bdef1c41de 100644 --- a/tools/domctl/src/uk/ac/cam/cl/xeno/domctl/Settings.java +++ b/tools/control/src/uk/ac/cam/cl/xeno/domctl/Settings.java @@ -6,12 +6,13 @@ import org.xml.sax.*; public final class Settings { - public static final String DEFAULTS_FILE = System.getProperty ("DEFAULTS_FILE"); - public static final String DEFAULTS_PATH = System.getProperty ("DEFAULTS_PATH"); + public static final String DEFAULTS_FILE = System.getProperty ("DEFAULTS_FILE", "domctl.xml"); + public static final String DEFAULTS_PATH = System.getProperty ("DEFAULTS_PATH", ".:/etc:/var/lib/xen"); public static final String LOCAL_IP = System.getProperty ("LOCAL_IP"); public static final String LOCAL_MASK = System.getProperty ("LOCAL_MASK"); public static final String LOCAL_GW = System.getProperty ("LOCAL_ROUTE"); public static final boolean TEST = (System.getProperty ("TEST") != null); + public static final String XI_HELPER = System.getProperty ("XI_HELPER", "xi_helper"); public static File getDefaultsFile() { @@ -30,7 +31,6 @@ public final class Settings if (result == null) { System.err.println ("Could not find " + DEFAULTS_FILE + " in path " + DEFAULTS_PATH); - System.exit (1); } return result; diff --git a/tools/domctl/src/uk/ac/cam/cl/xeno/domctl/StringPattern.java b/tools/control/src/uk/ac/cam/cl/xeno/domctl/StringPattern.java similarity index 100% rename from tools/domctl/src/uk/ac/cam/cl/xeno/domctl/StringPattern.java rename to tools/control/src/uk/ac/cam/cl/xeno/domctl/StringPattern.java diff --git a/tools/control/src/uk/ac/cam/cl/xeno/xenctl/Extent.java b/tools/control/src/uk/ac/cam/cl/xeno/xenctl/Extent.java new file mode 100644 index 0000000000..6bbb2325aa --- /dev/null +++ b/tools/control/src/uk/ac/cam/cl/xeno/xenctl/Extent.java @@ -0,0 +1,32 @@ +/* + * Extent.java + * 03.03.26 aho creation + */ + +package uk.ac.cam.cl.xeno.xenctl; + +public class +Extent +{ + int disk; + long offset; /* offset into disk */ + long size; /* size of this extent in 512 byte sectors */ + + public int + getDisk() + { + return disk; + } + + public long + getOffset() + { + return offset; + } + + public long + getSize() + { + return size; + } +} diff --git a/tools/control/src/uk/ac/cam/cl/xeno/xenctl/Library.java b/tools/control/src/uk/ac/cam/cl/xeno/xenctl/Library.java new file mode 100644 index 0000000000..0679ccaedd --- /dev/null +++ b/tools/control/src/uk/ac/cam/cl/xeno/xenctl/Library.java @@ -0,0 +1,114 @@ +/* + * Library.java + * 03.03.28 aho creation + */ + +package uk.ac.cam.cl.xeno.xenctl; + +public class +Library +{ + /* + * convert a number to a fixed width string + */ + static String + format (long input, int width, int prefix) + { + String sss = Long.toString(input); + String space = " "; + + if (width < sss.length()) + { + width = sss.length(); + } + + if (prefix == 0) + { + return space.substring(0, width - sss.length()) + sss; + } + else + { + return sss + space.substring(0, width - sss.length()); + } + } + + /* + * convert a string to a fixed width string + */ + static String + format (String input, int width, int prefix) + { + String space = " "; + + if (width < input.length()) + { + width = input.length(); + } + + if (prefix == 0) + { + return space.substring(0, width - input.length()) + input; + } + else + { + return input + space.substring(0, width - input.length()); + } + } + + /* + * convert a number (string format) into + * the corresponding integer value. + */ + static long + parse_size(String size) + { + String substring = size; + int suffix = 1; + + if ((substring = check(size, 'm')) != null) + { + suffix = 1024 * 1024; + } + else if ((substring = check(size, 'M')) != null) + { + suffix = 1024 * 1024; + } + else if ((substring = check(size, 'k')) != null) + { + suffix = 1024; + } + else if ((substring = check(size, 'K')) != null) + { + suffix = 1024; + } + else if ((substring = check(size, 'g')) != null) + { + suffix = 1024 * 1024 * 1024; + } + else if ((substring = check(size, 'G')) != null) + { + suffix = 1024 * 1024 * 1024; + } + else + { + substring = size; + } + + return Long.decode(substring).longValue() * suffix; + } + + static String + check(String size, char suffix) + { + int index = size.indexOf(suffix); + + if (index != -1) + { + return size.substring(0, index); + } + else + { + return null; + } + } +} diff --git a/tools/control/src/uk/ac/cam/cl/xeno/xenctl/Main.java.orig b/tools/control/src/uk/ac/cam/cl/xeno/xenctl/Main.java.orig new file mode 100644 index 0000000000..2110521bcb --- /dev/null +++ b/tools/control/src/uk/ac/cam/cl/xeno/xenctl/Main.java.orig @@ -0,0 +1,35 @@ +/* + * Main.java + * 03.03.26 aho creation + */ + +package uk.ac.cam.cl.xeno.vdmanager; + +import java.util.Date; + +public class +Main +{ + static String state_filename_in = "/var/lib/xen/vdstate.xml"; + static String state_filename_out = "/var/lib/xen/vdstate.xml"; + static String partition_filename = "/proc/partitions"; + + void + go (String[] argv) + { + PartitionManager pm = new PartitionManager(partition_filename); + VirtualDiskManager vdm = new VirtualDiskManager();; + Parser parser = new Parser(pm, vdm); + + XML.load_state(pm, vdm, state_filename_in); + parser.parse_main(argv); + XML.dump_state(pm, vdm, state_filename_out); + } + + public static void + main (String[] argv) + { + Main foo = new Main(); + foo.go(argv); + } +} diff --git a/tools/control/src/uk/ac/cam/cl/xeno/xenctl/Mode.java b/tools/control/src/uk/ac/cam/cl/xeno/xenctl/Mode.java new file mode 100644 index 0000000000..ade6126663 --- /dev/null +++ b/tools/control/src/uk/ac/cam/cl/xeno/xenctl/Mode.java @@ -0,0 +1,22 @@ +/* + * Mode.java + * 03.03.27 aho creation + * + * until we have jdk1.5, we're left with this mess... + */ + +package uk.ac.cam.cl.xeno.xenctl; + +public class +Mode +{ + private final String name; + + private Mode(String name) { this.name = name; } + + public String toString() { return name; } + + public static final Mode READ_ONLY = new Mode("ro"); + public static final Mode READ_WRITE = new Mode("rw"); +} + diff --git a/tools/control/src/uk/ac/cam/cl/xeno/xenctl/Parser.java b/tools/control/src/uk/ac/cam/cl/xeno/xenctl/Parser.java new file mode 100644 index 0000000000..a1459a1ba1 --- /dev/null +++ b/tools/control/src/uk/ac/cam/cl/xeno/xenctl/Parser.java @@ -0,0 +1,446 @@ +/* + * Parser.java + * 03.03.27 aho creation + */ + +package uk.ac.cam.cl.xeno.xenctl; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.InputStreamReader; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.StringTokenizer; +import java.util.Vector; +import java.util.Date; + +public class +Parser +{ + static String prompt = "vdmanager> "; + static String default_addpartition_chunksize = "104857600"; /* 100M */ + static int default_sector_size = 512; + + PartitionManager pm; + VirtualDiskManager vdm; + + Parser (PartitionManager pm, VirtualDiskManager vdm) + { + this.pm = pm; + this.vdm = vdm; + } + + void + parse_main (String[] argv) + { + if (argv.length == 0) + { + parse_input(null); + } + else + { + parse_commandline(argv); + } + } + + void + parse_input (String filename) + { + String line; + BufferedReader in; + + if (filename != null) + { + try + { + in = new BufferedReader(new FileReader(filename)); + } + catch (FileNotFoundException fnfe) + { + System.err.println (fnfe); + return; + } + } + else + { + in = new BufferedReader(new InputStreamReader(System.in)); + } + + try + { + if (filename == null) + { + System.out.print (prompt); + } + line = in.readLine(); + while (line != null) + { + StringTokenizer st = new StringTokenizer(line); + Vector v = new Vector(); + + while (st.hasMoreTokens()) + { + v.add(st.nextToken()); + } + + if (parse_commandline((String[]) v.toArray(new String[v.size()]))) + { + return; + } + + if (filename == null) + { + System.out.print (prompt); + } + line = in.readLine(); + } + } + catch (IOException ioe) + { + System.err.println(ioe); + } + + if (filename == null) + { + System.out.println (""); + } + return; + } + + boolean + parse_commandline (String[] commands) + { + if (commands.length == 0) + { + return false; + } + + String keyword = commands[0].toLowerCase(); + if (keyword.equals("file")) + { + if (commands.length < 2) + { + System.out.println ("file [filename]"); + return false; + } + for (int i = 1; i < commands.length; i++) + { + System.out.println ("file " + commands[i]); + parse_input(commands[i]); + } + } + else if (keyword.equals("show")) + { + parse_show(commands); + } + else if (keyword.equals("addpartition")) + { + parse_addpartition(commands); + } + else if (keyword.equals("vdcreate")) + { + parse_vdcreate(commands); + } + else if (keyword.equals("vddelete")) + { + parse_vddelete(commands); + } + else if (keyword.equals("vdrefresh")) + { + parse_vdrefresh(commands); + } + else if (keyword.equals("vbdcreate")) + { + parse_vbdcreate(commands); + } + else if (keyword.equals("vbddelete")) + { + parse_vbddelete(commands); + } + else if (keyword.equals("vbdflush")) + { + vdm.flush_virtual_block_devices(); + } + else if (keyword.equals("load")) + { + if (commands.length < 2) + { + System.out.println ("load "); + return false; + } + XML.load_state (pm, vdm, commands[1]); + } + else if (keyword.equals("save")) + { + if (commands.length < 2) + { + System.out.println ("save "); + return false; + } + XML.dump_state (pm, vdm, commands[1]); + } + else if (keyword.equals("help") || + keyword.equals("?")) + { + parse_help(); + } + else if (keyword.equals("exit") || + keyword.equals("quit")) + { + return true; + } + else + { + System.out.println ("unknown command [" + commands[0] + "]. " + + "try \"help\""); + } + return false; + } + + void + parse_vdcreate (String[] commands) + { + VirtualDisk vd; + + if (commands.length < 4) + { + System.out.println ("vdcreate name size expiry"); + return; + } + + vd = vdm.create_virtual_disk(commands[1], + Library.parse_size(commands[2]) / default_sector_size, + new Date()); + + System.out.println ("Virtual Disk created with key: " + vd.get_key()); + } + + void + parse_vddelete (String[] commands) + { + if (commands.length < 2) + { + System.out.println ("vddelete key"); + return; + } + + vdm.delete_virtual_disk(commands[1]); + } + + void + parse_vdrefresh (String[] commands) + { + if (commands.length < 3) + { + System.out.println ("vdrefresh key expiry"); + return; + } + + vdm.refresh_virtual_disk(commands[1], + new Date()); + } + + void + parse_vbdcreate (String[] commands) + { + VirtualDisk vd; + VirtualBlockDevice vbd; + + if (commands.length < 4) + { + System.out.println ("vbdcreate "); + return; + } + + if (commands[1].startsWith("sd") || + commands[1].startsWith("hd")) + { + /* + * this is a gross hack to allow you to create a virtual block + * device that maps directly to a physical partition + */ + + /* find the appropriate partition */ + Partition partition = pm.get_partition(commands[1]); + if (partition == null) + { + System.out.println ("vbdcreate error: couldn't find partition \"" + + commands[1] + "\""); + return; + } + + /* create a virtual disk */ + vd = new VirtualDisk("vbd:" + commands[1]); + vd.add_new_partition(partition, partition.nr_sects); + + + /* display result */ + System.out.print("domain:" + commands[2] + " "); + if (commands.length == 4) + { + System.out.print ("rw "); + } + else + { + System.out.print(commands[4] + " "); + } + System.out.print("segment:" + commands[3] + " "); + System.out.print(vd.dump_xen()); + System.out.println(""); + + return; + } + + if (commands.length == 4) + { + vbd = + vdm.create_virtual_block_device(commands[1], + Integer.decode(commands[2]).intValue(), + Integer.decode(commands[3]).intValue(), + "rw"); + } + else + { + vbd = + vdm.create_virtual_block_device(commands[1], + Integer.decode(commands[2]).intValue(), + Integer.decode(commands[3]).intValue(), + commands[4]); + } + + /* display commandline to user */ + { + vd = vdm.get_virtual_disk_key(commands[1]); + System.out.println ("\n" + vd.dump_xen(vbd) + "\n"); + } + } + + void + parse_vbddelete (String[] commands) + { + if (commands.length < 3) + { + System.out.println ("vbddelete "); + return; + } + + vdm.delete_virtual_block_device(Integer.decode(commands[1]).intValue(), + Integer.decode(commands[2]).intValue()); + } + + static String show_helptxt = "show "; + void + parse_show (String[] commands) + { + String subword; + + if (commands.length < 2) + { + System.out.println (show_helptxt); + return; + } + + subword = commands[1].toLowerCase(); + if (subword.equals("partition") || + subword.equals("partitions")) + { + System.out.println(pm.dump(true)); + } + else if (subword.equals("vd")) + { + String text; + + if (commands.length < 3) + { + System.out.println(vdm.dump_virtualdisks()); + return; + } + text = vdm.dump_virtualdisk(Integer.decode(commands[2]).intValue()); + if (text == null) + { + System.out.println("show vd error: invalid virtual disk number"); + } + else + { + System.out.println(text); + } + } + else if (subword.equals("vbd")) + { + System.out.println(vdm.dump_virtualblockdevices()); + } + else if (subword.equals("free")) + { + System.out.println(vdm.dump_free()); + } + else + { + System.out.println (show_helptxt); + return; + } + } + + void + parse_addpartition(String[] commands) + { + String chunksize = default_addpartition_chunksize; + + if (commands.length > 3 || commands.length < 2) + { + System.out.println ("addpartition [chunksize]"); + return; + } + if (commands.length == 3) + { + chunksize = commands[2]; + } + + System.out.println ("add partition " + commands[1] + " " + chunksize); + + vdm.add_xeno_partition(pm.get_partition(Integer.parseInt(commands[1])), + Library.parse_size(chunksize)/default_sector_size); + pm.add_xeno_partition(pm.get_partition(Integer.parseInt(commands[1]))); + } + + void + parse_help() + { + System.out.println ("file " + + "read the contents of a file as input to vdmanager"); + System.out.println ("addpartition [chunksize]"); + System.out.println (" " + + "add a partition as a xeno partition"); + System.out.println ("vdcreate "); + System.out.println (" " + + "create a new virtual disk"); + System.out.println ("vddelete " + + "delete a virtual disk"); + System.out.println ("vdrefresh "); + System.out.println (" " + + "reset virtual disk expiry"); + System.out.println ("vbdcreate [rw|ro]"); + System.out.println (" " + + "create a new virtual block device"); + System.out.println ("vbddelete "); + System.out.println (" " + + "delete a new virtual block device"); + System.out.println ("vbdflush " + + "remove all virtual block devices"); + System.out.println ("show partitions " + + "display a complete list of disk partitions"); + System.out.println ("show vd " + + "display virtual disk information"); + System.out.println ("show vbd " + + "display virtual virtual block device list"); + System.out.println ("show free " + + "display details about unallocated space"); + System.out.println ("load " + + "load new state from file"); + System.out.println ("save " + + "save state to file"); + System.out.println ("help " + + "display this help message"); + System.out.println ("quit " + + "exit"); + } +} diff --git a/tools/control/src/uk/ac/cam/cl/xeno/xenctl/Partition.java b/tools/control/src/uk/ac/cam/cl/xeno/xenctl/Partition.java new file mode 100644 index 0000000000..75c42e9589 --- /dev/null +++ b/tools/control/src/uk/ac/cam/cl/xeno/xenctl/Partition.java @@ -0,0 +1,125 @@ +/* + * Partition.java + * 03.03.26 aho creation + */ + +package uk.ac.cam.cl.xeno.xenctl; + +import java.io.*; + +public class +Partition +{ + int major; + int minor; + long blocks; + long start_sect; + long nr_sects; + String name; + boolean xeno; + + boolean + identical (Partition p) + { + return (major == p.major && + minor == p.minor && + blocks == p.blocks && + start_sect == p.start_sect && + nr_sects == p.nr_sects && + name.equals(p.name)); + } + + Partition + duplicate () + { + Partition p = new Partition(); + + p.major = major; + p.minor = minor; + p.blocks = blocks; + p.start_sect = start_sect; + p.nr_sects = nr_sects; + p.name = name; + p.xeno = xeno; + + return p; + } + + String + dump (boolean title) + { + if (title) + { + return ("maj:min " + + " blocks " + + "start sect " + + " num sects " + + "name"); + } + else + { + return (Library.format(major,3,0) + ":" + + Library.format(minor,3,1) + " " + + Library.format(blocks,10,0) + " " + + Library.format(start_sect,10,0) + " " + + Library.format(nr_sects,10,0) + " " + + Library.format(name,7,1)); + } + } + + void + dump_xml(PrintWriter out) + { + out.println (" \n" + + " " + major + "\n" + + " " + minor + "\n" + + " " + blocks + "\n" + + " " + start_sect + "\n" + + " " + nr_sects + "\n" + + " " + name + "\n" + + " "); + } + + public int + getMajor() + { + return major; + } + + public int + getMinor() + { + return minor; + } + + public long + getBlocks() + { + return blocks; + } + + public long + getStartSect() + { + return start_sect; + } + + public long + getNumSects() + { + return nr_sects; + } + + public String + getName() + { + return name; + } + + public boolean + getIsXeno() + { + return xeno; + } + +} diff --git a/tools/control/src/uk/ac/cam/cl/xeno/xenctl/PartitionManager.java b/tools/control/src/uk/ac/cam/cl/xeno/xenctl/PartitionManager.java new file mode 100644 index 0000000000..553f8db880 --- /dev/null +++ b/tools/control/src/uk/ac/cam/cl/xeno/xenctl/PartitionManager.java @@ -0,0 +1,191 @@ +/* + * PartitionManager.java + * 03.03.26 aho creation + */ + +package uk.ac.cam.cl.xeno.xenctl; + +import java.io.*; +import java.util.Vector; +import java.util.Enumeration; + +public class +PartitionManager +{ + Vector partition_map; + + static String proc_template = + "major minor #blocks start_sect nr_sects name"; + + /* + * Initialize partition manager with source file. + * Normally we read from /proc/partitions, but we can + * specify an alternative file for debugging + */ + PartitionManager (String filename) + { + String str; + BufferedReader in; + + partition_map = new Vector(100,10); + + try + { + in = new BufferedReader(new FileReader(filename)); + + str = in.readLine(); /* skip headings */ + if (str.length() < proc_template.length() || + !str.substring(0, proc_template.length()).equals(proc_template)) + { + System.err.println ("Error: Incorrect /proc/partitions."); + System.err.println (" Is this Xeno?"); + System.exit (1); + } + + str = in.readLine(); /* skip blank line */ + + str = in.readLine(); + while (str != null) + { + Partition partition = new Partition(); + + partition.major = Integer.parseInt(str.substring(0,5).trim()); + partition.minor = Integer.parseInt(str.substring(5,10).trim()); + partition.blocks = Integer.parseInt(str.substring(10,21).trim()); + partition.start_sect = Integer.parseInt(str.substring(21,32).trim()); + partition.nr_sects = Integer.parseInt(str.substring(32,43).trim()); + partition.name = str.substring(43).trim(); + partition.xeno = false; + + partition_map.add(partition); + str = in.readLine(); + } + } + catch (IOException io) + { + System.err.println ("PartitionManager: error reading partition file [" + + filename + "]"); + System.err.println (io); + } + } + + Partition + get_partition (String name) + { + Partition partition = null; + for (Enumeration e = partition_map.elements() ; e.hasMoreElements() ;) + { + partition = (Partition) e.nextElement(); + if (partition.name.equals(name)) + { + return partition; + } + } + return null; + } + + Partition + get_partition (int index) + { + return (Partition) partition_map.get(index); + } + + void + add_xeno_partition (Partition p) + { + for (Enumeration e = partition_map.elements() ; e.hasMoreElements() ;) + { + Partition partition = (Partition) e.nextElement(); + if (partition.identical(p)) + { + partition.xeno = true; + } + } + } + + /* + * dump the xeno partition list as xml + */ + void + dump_xml (PrintWriter out) + { + int loop; + + out.println(""); + for (Enumeration e = partition_map.elements() ; e.hasMoreElements() ;) + { + Partition partition = (Partition) e.nextElement(); + if (partition.xeno == true) + { + partition.dump_xml(out); + } + } + + out.println(""); + + return; + } + + /* + * dump the partition map as a string + * mark: mark the current xeno partitions in the partition map + */ + String + dump (boolean mark) + { + int loop, idx; + StringBuffer sb = new StringBuffer(); + Partition partition; + + for (idx = 0; idx < partition_map.size(); idx++) + { + partition = (Partition) partition_map.get(idx); + + if (idx == 0) + { + sb.append(" idx " + partition.dump(true) + "\n"); + } + if (partition.xeno) + { + sb.append("[ "); + } + else + { + sb.append(" "); + } + sb.append(Library.format(idx,2,0) + " " + partition.dump(false)); + if (partition.xeno) + { + sb.append("]\n"); + } + else + { + sb.append("\n"); + } + } + + return sb.toString(); + } + + /** + * get the number of partitions + */ + + int + getPartitionCount () + { + return partition_map.size(); + } + + /** + * get the details about a particular partition + * + */ + Partition + getPartition (int index) + { + Partition partition = (Partition) partition_map.get(index); + return partition; + } + +} diff --git a/tools/control/src/uk/ac/cam/cl/xeno/xenctl/RootBean.java b/tools/control/src/uk/ac/cam/cl/xeno/xenctl/RootBean.java new file mode 100644 index 0000000000..08f388dccb --- /dev/null +++ b/tools/control/src/uk/ac/cam/cl/xeno/xenctl/RootBean.java @@ -0,0 +1,223 @@ +/* + * RootBean.java + * 03.05.05 aho creation + */ + +package uk.ac.cam.cl.xeno.xenctl; + +import java.io.FileWriter; +import java.util.Date; +import java.util.Enumeration; +import javax.servlet.http.HttpSessionBindingEvent; +import javax.servlet.http.HttpSessionBindingListener; + +public class +RootBean + implements HttpSessionBindingListener +{ + static String state_filename_in = "/var/lib/xen/vdstate.xml"; + static String state_filename_out = "/var/lib/xen/vdstate.xml"; + static String partition_filename = "/proc/partitions"; + static int default_sector_size = 512; + + PartitionManager pm; + VirtualDiskManager vdm; + + int counter = 0; + + public + RootBean () + { + valueBound(null); + } + + public void + valueBound (HttpSessionBindingEvent event) + { + pm = new PartitionManager(partition_filename); + vdm = new VirtualDiskManager(); + XML.load_state(pm, vdm, state_filename_in); + } + + public void + valueUnbound (HttpSessionBindingEvent event) + { + doFlushState(); + } + + public int + getDebugCounter() + { + return counter++; + } + + /*************************************************************************/ + + public int + getPartitionCount() + { + return pm.getPartitionCount(); + } + + public Partition + getPartition(int index) + { + return pm.getPartition(index); + } + + public String + doAddPartition(String partition, String chunksize ) + { + Partition p = pm.get_partition(partition); + String result="done"; + int loop; + + if (p == null) + { + return (" eh? what partition: " + partition); + } + + vdm.add_xeno_partition(p, + Library.parse_size(chunksize)/default_sector_size); + pm.add_xeno_partition(p); + + /* return pm.dump(true); */ + return "done"; + } + + /*************************************************************************/ + + public int + getVirtualDiskCount () + { + return vdm.getVirtualDiskCount(); + } + + public VirtualDisk + getVirtualDisk (int index) + { + return vdm.getVirtualDisk(index); + } + + public VirtualDisk + getVirtualDiskKey (String key) + { + return vdm.get_virtual_disk_key(key); + } + + public String + doCreateVirtualDisk (String name, String size, long expiry) + { + VirtualDisk vd; + Date date = new Date(); + + vd = vdm.create_virtual_disk(name, + Library.parse_size(size)/default_sector_size, + new Date(date.getTime() + expiry)); + + return ("Virtual Disk created with key: " + vd.get_key()); + + } + + public String + doDeleteVirtualDisk (String key) + { + vdm.delete_virtual_disk(key); + + return ("okay"); + } + + public String + doRefreshVirtualDisk (String key, long expiry) + { + VirtualDisk vd = vdm.get_virtual_disk_key(key); + Date date; + String s = ""; + + if (vd == null) + { + return ("disk not found: " + key); + } + s = vd.get_expiry().toString(); + date = new Date(vd.get_expiry().getTime() + expiry); + vd.set_expiry(date); + + return ("okay " + expiry + " " + s + " " + date.toString()); + } + + /*************************************************************************/ + + public int + getFreeExtentCount () + { + VirtualDisk free = vdm.getFreeVirtualDisk(); + return free.getExtentCount(); + } + + public Extent + getFreeExtent (int index) + { + VirtualDisk free = vdm.getFreeVirtualDisk(); + return free.getExtent(index); + } + + /*************************************************************************/ + + public Enumeration + getVirtualBlockDevices () + { + return vdm.getVirtualBlockDevices(); + } + + public String + doCreateVirtualBlockDevice (String vd_key, int domain, + int vbd_num, String mode) + { + VirtualBlockDevice vbd; + VirtualDisk vd; + + vbd = vdm.create_virtual_block_device(vd_key, domain, vbd_num, mode); + if (vbd != null) + { + String command; + FileWriter fw; + + vd = vdm.get_virtual_disk_key(vd_key); + command = vd.dump_xen(vbd); + + try + { + fw = new FileWriter("/proc/xeno/dom0/vhd"); + fw.write(command); + fw.flush(); + fw.close(); + } + catch (Exception e) + { + return (e.toString()); + } + return command; + } + else + { + return "Error encountered"; + } + } + + public String + doFlushVirtualBlockDevices() + { + vdm.flush_virtual_block_devices(); + return "done"; + } + + /*************************************************************************/ + + + public void + doFlushState () + { + XML.dump_state(pm, vdm, state_filename_out); + } + +} diff --git a/tools/control/src/uk/ac/cam/cl/xeno/xenctl/SystemConfigurationBean.java b/tools/control/src/uk/ac/cam/cl/xeno/xenctl/SystemConfigurationBean.java new file mode 100644 index 0000000000..7c2605d8ce --- /dev/null +++ b/tools/control/src/uk/ac/cam/cl/xeno/xenctl/SystemConfigurationBean.java @@ -0,0 +1,30 @@ +/* + * SystemConfigurationBean.java + * 03.05.06 aho creation + */ + +package uk.ac.cam.cl.xeno.xenctl; + +import java.io.*; +import java.lang.Process; +import java.lang.Runtime; +import uk.ac.cam.cl.xeno.domctl.Defaults; + +public class +SystemConfigurationBean +{ + Defaults defaults; + + public + SystemConfigurationBean () + { + defaults = new Defaults(); + } + + public Defaults + getDefaults () + { + return defaults; + } + +} diff --git a/tools/control/src/uk/ac/cam/cl/xeno/xenctl/VirtualBlockDevice.java b/tools/control/src/uk/ac/cam/cl/xeno/xenctl/VirtualBlockDevice.java new file mode 100644 index 0000000000..62640e0edf --- /dev/null +++ b/tools/control/src/uk/ac/cam/cl/xeno/xenctl/VirtualBlockDevice.java @@ -0,0 +1,76 @@ +/* + * VirtualBlockDevice.java + * 03.03.27 aho creation + */ + +package uk.ac.cam.cl.xeno.xenctl; + +import java.io.PrintWriter; + +public class +VirtualBlockDevice +{ + String key; + int domain; + int vbdnum; + Mode mode; /* rw or ro */ + + String + dump (boolean title) + { + StringBuffer sb = new StringBuffer(); + int loop; + + if (title) + { + sb.append(" key dom vbd mode\n"); + } + else + { + sb.append(" " + key + " " + + Library.format(domain,3,0) + " " + + Library.format(vbdnum,3,0) + " " + + mode.toString() + "\n"); + } + + return sb.toString(); + } + + void + dump_xml (PrintWriter out) + { + out.println(" "); + out.println(" " + key + ""); + out.println(" " + domain + ""); + out.println(" " + vbdnum + ""); + out.println(" " + mode + ""); + out.println(" "); + + return; + } + + public String + getKey() + { + return key; + } + + public int + getDomain() + { + return domain; + } + + + public int + getVBDNum() + { + return vbdnum; + } + + public Mode + getMode() + { + return mode; + } +} diff --git a/tools/control/src/uk/ac/cam/cl/xeno/xenctl/VirtualDisk.java b/tools/control/src/uk/ac/cam/cl/xeno/xenctl/VirtualDisk.java new file mode 100644 index 0000000000..fb751db4e2 --- /dev/null +++ b/tools/control/src/uk/ac/cam/cl/xeno/xenctl/VirtualDisk.java @@ -0,0 +1,257 @@ +/* + * VirtualDisk.java + * 03.03.26 aho creation + */ + +package uk.ac.cam.cl.xeno.xenctl; + +import java.util.Date; +import java.util.Vector; +import java.lang.Math; +import java.io.PrintWriter; + +public class +VirtualDisk +{ + String name; + String key; + Date expiry; + Vector extents; + + VirtualDisk (String name, Date expiry, String key) + { + this.name = name; + this.key = key; + this.expiry = expiry; + extents = new Vector(); + } + + VirtualDisk (String name) + { + this (name, null, null); + this.key = generate_key(); + extents = new Vector(); + + return; + } + + VirtualDisk (String name, Date expiry) + { + this(name, expiry, null); + this.key = generate_key(); + } + + /* + * generate a unique key for this virtual disk. + * for now, just generate a 10 digit number + */ + String + generate_key () + { + return Long.toString(1000000000l + (long)(Math.random() * 8999999999l)); + } + + String + get_key () + { + return key; + } + + Date + get_expiry () + { + return expiry; + } + + void + set_expiry (Date expiry) + { + this.expiry = expiry; + } + + public void + add_extent (Extent extent) + { + extents.add(extent); + } + + public Extent + remove_extent () + { + Extent e; + + if (extents.size() > 0) + { + e = (Extent) extents.remove(0); + } + else + { + e = null; + } + + return e; + } + + String + dump (boolean details, boolean title) + { + StringBuffer sb = new StringBuffer(); + int loop; + + if (details) + { + if (title) + { + sb.append(" name: " + name + "\n"); + sb.append(" key: " + key + "\n"); + sb.append("expiry: " + expiry + "\n"); + sb.append("\n"); + } + sb.append(" idx disk offset size \n"); + for (loop = 0; loop < extents.size(); loop++) + { + Extent e = (Extent) extents.get(loop); + sb.append(" " + + Library.format(loop,3,0) + " " + + Library.format(e.disk,6,0) + + Library.format(e.offset,10,0) + + Library.format(e.size,10,0) + "\n"); + } + } + else + { + if (title) + { + sb.append(" key expiry name\n"); + } + else + { + sb.append(" " + key + " " + expiry.toString() + " " + name + "\n"); + } + } + + return sb.toString(); + } + + String + dump_xen () + { + StringBuffer sb = new StringBuffer(); + + sb.append("extents:" + extents.size() + " "); + for (int loop = 0; loop < extents.size(); loop++) + { + Extent e = (Extent) extents.get(loop); + sb.append("(disk:" + e.disk + " " + + "offset:" + e.offset + " " + + "size:" + e.size + ")"); + } + return sb.toString(); + } + + String + dump_xen (VirtualBlockDevice vbd) + { + StringBuffer sb = new StringBuffer(); + + sb.append("domain:" + vbd.domain + " " + + vbd.mode.toString() + " " + + "segment:" + vbd.vbdnum + " " + + "extents:" + extents.size() + " "); + for (int loop = 0; loop < extents.size(); loop++) + { + Extent e = (Extent) extents.get(loop); + sb.append("(disk:" + e.disk + " " + + "offset:" + e.offset + " " + + "size:" + e.size + ")"); + } + return sb.toString(); + } + + void + dump_xml (PrintWriter out) + { + out.println(" "); + out.println(" " + name + ""); + out.println(" " + key + ""); + if (expiry == null) + { + out.println(" 0"); + } + else + { + out.println(" " + expiry.getTime() + ""); + } + out.println(" "); + for (int loop = 0; loop < extents.size(); loop++) + { + Extent e = (Extent) extents.get(loop); + out.println(" "); + out.println(" " + e.disk + ""); + out.println(" " + e.size + ""); + out.println(" " + e.offset + ""); + out.println(" "); + } + out.println(" "); + out.println(" "); + + return; + } + + /* + * Add a partition as a XenoPartition. + * Chop the partition in to extents and of size "size" sectors + * and add them to the virtual disk. + */ + + void + add_new_partition (Partition partition, long size) + { + int loop; + + for (loop = 0; loop < partition.nr_sects / size; loop++) + { + Extent extent = new Extent(); + + extent.disk = partition.major << 8; + extent.disk = extent.disk | (partition.minor >> 5) << 5; + extent.size = size; + extent.offset = partition.start_sect + (size * loop); + + add_extent(extent); + } + + return; + } + + public String + getName() + { + return name; + } + + public String + getKey() + { + return key; + } + + public String + getExpiry() + { + return expiry.toString(); + } + + public int + getExtentCount() + { + return extents.size(); + } + + public Extent + getExtent(int index) + { + return (Extent) extents.get(index); + } + +} diff --git a/tools/control/src/uk/ac/cam/cl/xeno/xenctl/VirtualDiskManager.java b/tools/control/src/uk/ac/cam/cl/xeno/xenctl/VirtualDiskManager.java new file mode 100644 index 0000000000..a225efde91 --- /dev/null +++ b/tools/control/src/uk/ac/cam/cl/xeno/xenctl/VirtualDiskManager.java @@ -0,0 +1,315 @@ +/* + * VirtualDiskManager.java + * 03.03.26 aho creation + */ + +package uk.ac.cam.cl.xeno.xenctl; + +import java.util.Enumeration; +import java.util.Vector; +import java.util.Hashtable; +import java.util.Date; +import java.io.PrintWriter; + +public class +VirtualDiskManager +{ + VirtualDisk free_disk; + Vector virtual_disks; + Hashtable virtual_block_devices; + Hashtable key_hash; + + VirtualDiskManager () + { + free_disk = new VirtualDisk("free"); + + virtual_disks = new Vector(10,5); + flush_virtual_block_devices(); + key_hash = new Hashtable(100); + } + + public VirtualDisk + get_virtual_disk_key (String key) + { + return ((VirtualDisk) key_hash.get(key)); + } + + public void + add_xeno_partition (Partition partition, long size) + { + free_disk.add_new_partition (partition, size); + return; + } + + /* + * create a new virtual disk + */ + + public VirtualDisk + create_virtual_disk(String name, long size, Date expiry) + { + VirtualDisk vd = new VirtualDisk (name, expiry); + + while (size > 0) + { + Extent e; + + e = free_disk.remove_extent(); + if (e == null) + { + return null; + } + size -= e.size; + vd.add_extent(e); + } + + add_virtual_disk(vd); + + return vd; + } + + /* + * delete a new virtual disk. extents go back into the free pool + */ + + public void + delete_virtual_disk (String key) + { + VirtualDisk vd; + + vd = (VirtualDisk) key_hash.get(key); + if (vd != null) + { + Extent e; + + key_hash.remove(key); + virtual_disks.remove(vd); + + e = vd.remove_extent(); + while (e != null) + { + free_disk.add_extent(e); + e = vd.remove_extent(); + } + } + return; + } + + /* + * reset the expiry time for a virtual disk + */ + + public void + refresh_virtual_disk (String key, Date expiry) + { + VirtualDisk vd = (VirtualDisk) key_hash.get(key); + if (vd != null) + { + vd.set_expiry(expiry); + } + } + + /* + * create a new virtual block device + */ + public VirtualBlockDevice + create_virtual_block_device (String key, int domain, int vbd_num, + String mode) + { + VirtualBlockDevice vbd = new VirtualBlockDevice(); + VirtualDisk vd = get_virtual_disk_key(key); + + if (vd == null) + { + System.err.println("create virtual block device error: unknown key " + + "[" + key + "]"); + return null; + } + + vbd.key = key; + vbd.domain = domain; + vbd.vbdnum = vbd_num; + + if (mode.equals(Mode.READ_ONLY.toString()) || + mode.equals("RO") || + mode.equals("ro")) + { + vbd.mode = Mode.READ_ONLY; + } + else if (mode.equals(Mode.READ_WRITE.toString()) || + mode.equals("RW") || + mode.equals("rw")) + { + vbd.mode = Mode.READ_WRITE; + } + else + { + System.err.println("create virtual block device error: unknown mode " + + "[" + mode + "]"); + return null; + } + + add_virtual_block_device(vbd); + + return vbd; + } + + /* + * delete a virtual block device + */ + public void + delete_virtual_block_device (int domain, int vbd_num) + { + Object hash = get_vbd_hash(domain, vbd_num); + VirtualBlockDevice vbd = (VirtualBlockDevice)virtual_block_devices.remove(hash); + return; + } + + /* + * flush all virtual block devices + */ + public void + flush_virtual_block_devices () + { + /* isn't automatic garbage collection wonderful? */ + virtual_block_devices = new Hashtable(100); + } + + public void + add_virtual_disk (VirtualDisk vd) + { + virtual_disks.add(vd); + key_hash.put(vd.get_key(), vd); + } + + public void + add_virtual_block_device (VirtualBlockDevice vbd) + { + Object hash = get_vbd_hash(vbd.domain, vbd.vbdnum); + virtual_block_devices.put(hash, vbd); + } + + Object + get_vbd_hash (int domain, int vbd_num) + { + return new Integer(domain * 16 + vbd_num); + } + + public void + add_free (VirtualDisk vd) + { + free_disk = vd; + } + + public String + dump_virtualdisk (int segment) + { + if (segment < 0 || segment >= virtual_disks.size()) + { + return null; + } + else + { + VirtualDisk vd = (VirtualDisk) virtual_disks.get(segment); + return (vd.dump(true, true)); + } + } + + public String + dump_free() + { + return(free_disk.dump(true, false)); + } + + public String + dump_virtualdisks() + { + StringBuffer sb = new StringBuffer(); + + for (int i = 0; i < virtual_disks.size(); i++) + { + VirtualDisk vd = (VirtualDisk) virtual_disks.get(i); + if (i == 0) + { + sb.append(vd.dump(false, true)); + } + sb.append(vd.dump(false, false)); + } + + return sb.toString(); + } + + public String + dump_virtualblockdevices() + { + StringBuffer sb = new StringBuffer(); + boolean first = true; + + for (Enumeration enumeration = virtual_block_devices.elements() ; + enumeration.hasMoreElements() ;) + { + VirtualBlockDevice vbd = (VirtualBlockDevice) enumeration.nextElement(); + if (first) + { + sb.append(vbd.dump(true)); + first = false; + } + + sb.append(vbd.dump(false)); + } + + return sb.toString(); + } + + public void + dump_xml(PrintWriter out) + { + out.println(""); + free_disk.dump_xml(out); + out.println(""); + out.println(""); + for (int i = 0; i < virtual_disks.size(); i++) + { + VirtualDisk vd = (VirtualDisk) virtual_disks.get(i); + vd.dump_xml(out); + } + out.println(""); + out.println(""); + for (Enumeration enumeration = virtual_block_devices.elements() ; + enumeration.hasMoreElements() ;) + { + VirtualBlockDevice vbd = (VirtualBlockDevice) enumeration.nextElement(); + vbd.dump_xml(out); + } + + out.println(""); + + return; + } + + /*************************************************************************/ + + public int + getVirtualDiskCount () + { + return virtual_disks.size(); + } + + public VirtualDisk + getVirtualDisk (int index) + { + return (VirtualDisk) virtual_disks.get(index); + } + + public VirtualDisk + getFreeVirtualDisk () + { + return free_disk; + } + + public Enumeration + getVirtualBlockDevices () + { + return virtual_block_devices.elements(); + } +} diff --git a/tools/control/src/uk/ac/cam/cl/xeno/xenctl/XML.java b/tools/control/src/uk/ac/cam/cl/xeno/xenctl/XML.java new file mode 100644 index 0000000000..cf62466ff7 --- /dev/null +++ b/tools/control/src/uk/ac/cam/cl/xeno/xenctl/XML.java @@ -0,0 +1,126 @@ +/* + * XML.java + * 03.03.26 aho creation + */ + +package uk.ac.cam.cl.xeno.xenctl; + +import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.FileWriter; +import java.io.BufferedWriter; +import java.io.FileNotFoundException; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.FactoryConfigurationError; +import javax.xml.parsers.ParserConfigurationException; +import org.w3c.dom.Document; +import org.w3c.dom.DOMException; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; + +public class +XML +{ + static Document document = null; + + /* + * dump partition manager and virtual disk manager state to filename + */ + + static void + dump_state (PartitionManager pm, VirtualDiskManager vdm, String filename) + { + PrintWriter out; + + try + { + out = new PrintWriter(new BufferedWriter(new FileWriter(filename))); + } + catch (IOException e) + { + System.err.println ("XML.dump_state error [" + filename + "]"); + System.err.println (e); + return; + } + + out.println(""); + out.println(""); + pm.dump_xml(out); + vdm.dump_xml(out); + out.println(""); + + out.close(); + return; + } + + /* + * load partition manager and virtual disk manager state from filename + */ + static void + load_state (PartitionManager pm, VirtualDiskManager vdm, String filename) + { + if (document == null) + { + load_file (filename); + } + + XMLHelper.parse(pm, vdm, document); + } + + /* + * load XML from disk + */ + static void + load_file (String filename) + { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + // factory.setNamespaceAware(true); + // factory.setValidating(true); + + try + { + File file = new File(filename); + + DocumentBuilder builder = factory.newDocumentBuilder(); + document = builder.parse(file); + } + catch (SAXParseException spe) /* error generated by parser */ + { + System.err.println ("xml parser exception on line " + + spe.getLineNumber() + + " for uri " + spe.getSystemId()); + System.err.println (spe.getMessage()); + + Exception x = spe; + if (spe.getException() != null) + x = spe.getException(); + x.printStackTrace(); + System.exit(1); + } + catch (SAXException sxe) + { + Exception e = sxe; + if (sxe.getException() != null) + e = sxe.getException(); + e.printStackTrace(); + System.exit(1); + } + catch (ParserConfigurationException pce) + { + pce.printStackTrace(); + } + catch (FileNotFoundException fnfe) + { + System.err.println ("warning: state file not found [" + + filename + "]"); + } + catch (IOException ioe) + { + ioe.printStackTrace(); + } + return; + } +} diff --git a/tools/control/src/uk/ac/cam/cl/xeno/xenctl/XMLHelper.java b/tools/control/src/uk/ac/cam/cl/xeno/xenctl/XMLHelper.java new file mode 100644 index 0000000000..79fdd63177 --- /dev/null +++ b/tools/control/src/uk/ac/cam/cl/xeno/xenctl/XMLHelper.java @@ -0,0 +1,205 @@ +/* + * XMLHelper.java + * 03.03.27 aho creation + */ + +package uk.ac.cam.cl.xeno.xenctl; + +import java.util.Date; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +public class +XMLHelper +{ + static void + dump_document (Document document) + { + dump_element(document.getDocumentElement(), 0); + } + + static void + dump_element (Element element, int indent) + { + NodeList nl = element.getChildNodes(); + + System.out.println ("<" + element.getTagName() + ">"); + dump_nodelist(nl, indent + 1); + System.out.println(""); + } + + static void + dump_nodelist (NodeList nl, int indent) + { + for (int loop = 0; loop < nl.getLength(); loop++) + { + Node node = nl.item(loop); + switch (node.getNodeType()) + { + case Node.ELEMENT_NODE : + { + dump_element((Element)node, indent); + break; + } + case Node.TEXT_NODE : + { + System.out.println("TEXT: " + node.getNodeValue()); + break; + } + default : + { + System.out.println("NODE: " + node.getNodeType()); + } + } + } + } + + static Node + get_subnode (String name, Node node) + { + if (node.getNodeType() != Node.ELEMENT_NODE) + { + System.err.println("Error: Search node not of element type"); + return null; + } + + if (!node.hasChildNodes()) return null; + + NodeList list = node.getChildNodes(); + for (int i=0; i < list.getLength(); i++) + { + Node subnode = list.item(i); + if (subnode.getNodeType() == Node.ELEMENT_NODE) + { + if (subnode.getNodeName() == name) return subnode; + } + } + return null; + } + + static String + get_text (Node node) + { + StringBuffer result = new StringBuffer(); + if (node==null || !node.hasChildNodes()) return ""; + + NodeList list = node.getChildNodes(); + for (int i=0; i < list.getLength(); i++) + { + Node subnode = list.item(i); + if (subnode.getNodeType() == Node.TEXT_NODE) + { + result.append(subnode.getNodeValue()); + } + } + return result.toString(); + } + + static void + parse (PartitionManager pm, VirtualDiskManager vdm, Document document) + { + if (document == null) return; + + /* parse partitions */ + parse_partitions(pm, document.getElementsByTagName("partition")); + + /* parse virtual disks */ + NodeList list = document.getElementsByTagName("virtual_disk"); + for (int i = 0; i < list.getLength(); i++) + { + Node subnode = list.item(i); + String parent = subnode.getParentNode().getNodeName(); + VirtualDisk vd = parse_virtual_disk(subnode); + + if (parent.equals("free")) + { + vdm.add_free(vd); + } + else if (parent.equals("virtual_disks")) + { + vdm.add_virtual_disk(vd); + } + else + { + System.out.println ("XML parse error: unknown parent for virtual_disk " + + "[" + parent + "]"); + } + } + + /* parse virtual block devices */ + parse_virtual_block_devices(vdm, document.getElementsByTagName("virtual_block_device")); + + return; + } + + static VirtualDisk + parse_virtual_disk(Node node) + { + VirtualDisk vd; + Date date = new Date(); + NodeList list; + + date.setTime(Long.parseLong(XMLHelper.get_text(XMLHelper.get_subnode("expiry", node)))); + vd = new VirtualDisk(XMLHelper.get_text(XMLHelper.get_subnode("name", node)), + date, + XMLHelper.get_text(XMLHelper.get_subnode("key", node))); + + list = XMLHelper.get_subnode("extents", node).getChildNodes(); + for (int i = 0; i < list.getLength(); i++) + { + Node enode = list.item(i); + + if (enode.getNodeType() == Node.ELEMENT_NODE && + enode.getNodeName().equals("extent")) + { + Extent extent = new Extent(); + + extent.disk = Integer.parseInt(XMLHelper.get_text(XMLHelper.get_subnode("disk", enode))); + extent.size = Long.parseLong(XMLHelper.get_text(XMLHelper.get_subnode("size", enode))); + extent.offset = Long.parseLong(XMLHelper.get_text(XMLHelper.get_subnode("offset", enode))); + vd.add_extent(extent); + } + } + + return vd; + } + + static void + parse_partitions (PartitionManager pm, NodeList nl) + { + Partition partition; + + for (int loop = 0; loop < nl.getLength(); loop++) + { + Node node = nl.item(loop); + + partition = new Partition(); + partition.major = Integer.parseInt(XMLHelper.get_text(XMLHelper.get_subnode("major", node))); + partition.minor = Integer.parseInt(XMLHelper.get_text(XMLHelper.get_subnode("minor", node))); + partition.blocks = Integer.parseInt(XMLHelper.get_text(XMLHelper.get_subnode("blocks", node))); + partition.start_sect = Integer.parseInt(XMLHelper.get_text(XMLHelper.get_subnode("start_sect", node))); + partition.nr_sects = Integer.parseInt(XMLHelper.get_text(XMLHelper.get_subnode("nr_sects", node))); + partition.name = XMLHelper.get_text(XMLHelper.get_subnode("name", node)); + + pm.add_xeno_partition(partition); + } + } + + static void + parse_virtual_block_devices (VirtualDiskManager vdm, NodeList nl) + { + VirtualBlockDevice vbd; + + for (int loop = 0; loop < nl.getLength(); loop++) + { + Node node = nl.item(loop); + + vdm.create_virtual_block_device(XMLHelper.get_text(XMLHelper.get_subnode("key", node)), + Integer.parseInt(XMLHelper.get_text(XMLHelper.get_subnode("domain", node))), + Integer.parseInt(XMLHelper.get_text(XMLHelper.get_subnode("vbdnum", node))), + XMLHelper.get_text(XMLHelper.get_subnode("mode", node))); + } + } +} diff --git a/tools/control/web/WEB-INF/web.xml b/tools/control/web/WEB-INF/web.xml new file mode 100644 index 0000000000..c1e0d41784 --- /dev/null +++ b/tools/control/web/WEB-INF/web.xml @@ -0,0 +1,20 @@ + + + + + Xen Control + + Copyright 2003, University of Cambridge Computer Laboratory + This is version 1.0-beta of the Xen control software. + + + index.jsp + + + + 30 + + + diff --git a/tools/control/web/img/cambridge.gif b/tools/control/web/img/cambridge.gif new file mode 100644 index 0000000000000000000000000000000000000000..f30964c143c4e88cd9c871256bfbd820661b25dd GIT binary patch literal 1733 zcmV;$20HmiNk%w1VZZ<`0J8u900030|NpVE0J#VV%*@PdV_TV-nKLsp{s96200000 z00000000000000000000A^8LZ6afDKEC2ui0Kfn)000F4Fvv-(y*TU5yZ>M)j$~<` zXsWJk>%MR-&vb3yc&_h!@Bb-)a7Zi~kHU(9XqYU8h9{s!avS~dw zmBa(V0G)Q8Zed%?9 zSSWVN;@vq^P0oOClLENv^-zEuM-T^ytM%`WIXcJxJZ;?NF(jW<3NZRZ&RH)rBb*sr8{IU;r*J2MjCd?~c)vn;ov}6_blYrTbEMD5z3sF8O>YqtS|#m(QnbbQ6wlbO--Xpw1X$KJw*nq+OfPUSS`?p z8JIpbU$=~jSVK>+n%g2XJm`<|0Hl}xC7MW^CPmT#PzM}VYHYfCq-?XD`BRgdU43#5 zoJXsYHa68_-hdke@n|}n3uL(Dk|CObskvqsf~Xnd zPub|DO%&i5@J$n>kOG~3gAfv4b44zpO>>-`q(rEN)C3YDq*&DxZv-iZNMfj7=t&zk zW}w(b>z!Ihk)MX*sZxwQ(u9CverlZmt{gy%fwU_40)&Xva&U<&R%{hTB9A16%cV#i zcI~<7Zg5F2+sqNg8r>*s#TrqxYi_#u=Ig9Pm!8^41_pG=_24H*pVXe z8F?a8Z?@V{Y_JQzylb%r(m3Mr$J9vh-^V0hVcc(yv=Xc!eV*E!w6@Bz6{~;DkxHUN z6ygY2wu;(Js6_yxLCh&{<_{7UCW##*1S+yd#&Yr|33d^82i9>CR+hmjoWVm#)}2Uk z^_VX88kSGO3W>+S$$3_WkWZ+&#E1`B<4sWusU}@fM49|(*SsNjO3Ph!Nz-lr{ML3_ zXww*wqj6si2C;9b-3oHODhaaxAE;eNon4gVbynk>I9jxPg}2Px*U1^1G(vB#bhLMu zzliqaTU&0pE_5@M$TfOdYv4DfxwcbF_F?{N?!O5x$LmoszW6J$J6@Qhg|!v=&^Onv z!S8-ygpH?rR}+ry8=qPs@;lk;nIqd%77E$0r+pUfyR$dZWx015AsVH@i<7(+rSM7O zHQ3vbCaf~8RVeOFUKj#$GU1CJ6$y9j@eFaW_M(?C@BP#>zu-tw{r)trba2Si}{ z_<)}xlId)cfeiiFqX}aFpyfBABGv|fc)0Ue(Ktj3hRgu9M7-%@FVh&xBE*1!=6&FZ zNE}BO4F!uEO2vgWDj?sBYbp(_`0BMADrQ=`4PIbH%x{eT}{9;Gq zrzb5T2bBpVo7f(uy99EqX>Ul;Bo#rpGB!{$eFWk-m=Q+#wa%OM^P=1YL&n*Gb9CLy zUlV;5%W=IyDbzF@J5w3BLtW?;V`By}b#zWI`UZKnItVh4DVR_mt(g~E*_ucPp%7g1 zalR0PuJXtdW=v*sl<9<&KXdsUQ`UoZ3{nP=expwbGN>29D8t6YAh0}8E?TS8VIOQ3 z(>2a44OU>)s8SJAqxDpWw@L`j=8?0W!76)4u-VD*c&k}36{jG0!b?RE3>l>FVq2>! bR=3L4u6p&WU=6ES$4b_+n)R$;jQ{{UpNu1x literal 0 HcmV?d00001 diff --git a/tools/control/web/img/help.gif b/tools/control/web/img/help.gif new file mode 100644 index 0000000000000000000000000000000000000000..e7d480939bd51b9d0ea7cb2d540ab8c03e46cf6c GIT binary patch literal 243 zcmZ?wbhEHbG-VKC*vtR~##5%O{{R2KgG1VxGiMGQIGd2rprGLUkC6!^i2)RUvapCS z{AbVs$$-pYU|A5*;JJFQMYhiN{|m0x9%hhBtLU8<(7?LdZ_~3wTW1x!C5Z9 zdX~cE=$2hoS|D8~YF@%_&ukdk8k6Rcq-%-jGUF91h1t`V duiNa;vTgg0ox67L*}L0*-@!wNcM39C0|3KbT+jdj literal 0 HcmV?d00001 diff --git a/tools/control/web/img/home.gif b/tools/control/web/img/home.gif new file mode 100644 index 0000000000000000000000000000000000000000..9c07803d3b391aa1c5712480ccfa6c86aeccecfa GIT binary patch literal 244 zcmZ?wbhEHbG-VKC*v!DdF!Kx$IBdT8|Ns95H{TQ-dt|WY+JR@E{xLEEB{6~GPZkyt zhW`vYASsX;3@i%^8a!9;waC`l{(r&M#3sRc_bYhWU!|?OvCl*_T*r{-P|6GDrjrF4 zZ}^&&Sv@}7$!T`lw0ZJ7hG513X;z7~#xvSXEj{*4&fm22SXnvKI!~V2GxzTCycAXN z{X2toQ)P)vS$b?mOGB_l*nyy~8W}Vsk fjT<&?WML9}ASWA-Tv z4FqHunw|5Ko^X~Zc^gjPVXA1>{1jOu+8Yuc)Nra+f7M!r1}2Fkp{E`^TN-=v-L}F* z&hc~H*y1fLvTRE2$}{x40)v`ta)1YWsaCz zlQ~`7+*a6mn}-*xP1EElUj9DwHf=IGzTm_u-P31{&z)mpxqRj7wd*%--nwz=_PzTL Jt_d<&0|3rJY>5B> literal 0 HcmV?d00001 diff --git a/tools/control/web/img/xeno.gif b/tools/control/web/img/xeno.gif new file mode 100644 index 0000000000000000000000000000000000000000..efd7d0ad9ff835de606367f635fa874c895df32d GIT binary patch literal 3600 zcmWkwdpMJe1K!Or%VjsiFqgzy!jaI*#*SvKVxeetTsF6;xtusE*(^h=aD*toxr9)M zbfHvoOOmKns;>_9mFj$Tocb#D``Y>Sd;fUVcB|@Ie)PsZ+;d1A!bQE(W$HA>Sa7NCa7I znB@j!q{9CGAdLyuRRUrW63hqsI*<%GA`XWi>ww%;9gPCE9ft$`p}17|BLsMPAQ&97 zFIQ({jocbShOYr}5(IpV=x!mZeB@|3v~C0Z9&9o&Mmk!N%Uys-2%6HMrEWlUxWt+P zsd6AP8O}_HBQ_xv8q!#Uq$UE+j>y){hzS9yt%5WvV5uAO{TssJK$p(~3_Bo2+C(4% z=4R0EM-XQwa;_6bV0ce1;O~nZDuNld$g<_g(}&2X_d1~n9=?)=CuUhQ#$BBufA8^V z3Ak@R)Z76%+3UQQLkt`6a1j{D1$QTb@lsF{J?_rd1qDEOBRF0H{$8rvor*lUg?M?x zk|^Zu6CKAJG9f?|22^(p6pNsadRQuh*NG75RR;zK3Plis0;VN{s=W}O4|#h-yZ1to z5}3w-3so?l0{>_{HC6Y6C&pn@3f$fS9M-^B`+#5(l8_3rykU25n8ODzb-+PY4zSH*~cR)+2D93RuHON-Cf= ze4P&mvU3JAv%u|ASjY!+vj7@>?+*_TbmMjmsQEbj3V?#WK^g_Ra0c3)g?t8~$S{~j zfeUkBJPxib(?y2E&05&S8J-w|eY{{(B3xGmUp=RDcSRDUupI@_L!i4W?9PVQaDd2g zBxZP$jJY;seJF~J`howC1ZAX0 zUDH?}I55+%#FHH*Ii2-^YNEYRBd}-~F1B162efv@j~rnH#95tMU+V1gZ?%V?T5t@vT`){2xT%?x7CAG3o8 z{?xy_95;H|bTzH9BK6bpF>3ilum8nU9?$RO47#5OE-FsgVCgDFO|vaF@5K4%IbIWY zPS}v2pGMu@lP0;S9C`jd`^?B8xi8|?g=)WZ$S3bZXx+DsYWu{r$3-Pz@5StM4PW)o z&L5u*K7VblR8+6Na!AF$*BDLv2z+IaSMqs4-?8Br(V zMapUO)<0E}H;YG;3a>bp;O?usLa2GpuQj-~q00MqMi;u62iPgY|6%?+WJwp+!?SDc zHv*G&xVPLH!e;I3X&!bNtv4d4>H7`J(gb27jv1{jz^~XI+bObv`YjsEB*IUQl7&wP zie1womlqK~5Su*_3h)X`}jjVjjvP&ncwts(_lBBo%rrz8N zd5pGc+{)5#|0J89{cDv2v#TbgLFmXe>?TTglM zf?dO%U$k2@Tg_dfmsh6H@u7V!sn+kOJ53#%HVpHqV!&mLB6d|gT_nzWts`(|_NWcX z<6-wbzdoD7Gc!B<=joxU1;BQ~H#5k-CBOSVCl{>M4rU8@W4(z{MYFMS3;%><&`Wtd z>PAWW;O%`mj+=#ZT8E!)vY~DvmfmysFf9%FZ!lIGgE?^6_?daJ=7Z+<8D9hbu#lDq zpadjFX}U30ECoi$W$YE(%B$g7xl(>{N=?qZGQI7W*rfCz{gQRn_tpZB{O%R2Tw_TM zfbmS?AX#q6HD#J{o^H3P7)_EW8;Vd=N52c`;347nMiYv0!r24oHm2Pj%4~pw#y!+a z7HuuH-6h}>rUYlaVV1x5%8;p`ZbNV5 zfkCxLtB>$6(NrDfYG>|-rP*-UBFCjYXKyamPFp;;#Y*4SZc<(7J!2XzkQ@1*%g0da zPzF|6N=#Ro3A^qEF-*f{)e3@bI5U2;#~TT-VDe4#S;N<|7Nd=RYrVJJC~WnX5hn*t zS8=PV_Kyyl?J_Djrw=>4tF)irdvKHZm9DB%bIME~;1Q<5IZ;{8Nf=y@4f%6up<9+x zu<^}+2MNUDL^6ZxqlaB5`Y9FjJdBlz+SxhCI%L{`mseySuD@O&LJh=+TRCpKigW7@ zZ!;#L_^SmUZR~;2;rKjO^&8;C+uf z&3s)G4MxllESIaRLuO?L>*uk|o*wG0n1(fCbDnLzQZ@J#W$zlVwAKa{IH%7fruCqm zCMxhT33C=(&k_l?T;ItomTx!vmNUZD7-kH6y&R3(t>ujc=m)8f`v%c9R?9{lZn)96 z#3=FUN8@m37X7EQL9B5=C-6VIH|slUg;}M=Hu7%vPVS^_QfzyR`Ku#yM$&H_tD~C* zGx#QM1g*j4RvXf2U&~euh%+!@Dy+J%YwOCb!Px<82=*H?)hn9@Y=iyO2GZ%_ z6>UwncBxqR%Z-M)ssfV@ero4t)JlsiGPR3rumlxf=!1)C$_YEx@gT#LUo>F0OmJ#% z^4bUP_x zPos7(9yhaJeedy18n^#pn!EZNjWjN&i zmAyT@wVy2`?~?}`B0G*&Xt6sDQGZ0pYnakFt*m17y~At*<~Q+4(_?~3Q%PC5nAvI_ zx4|(z-`wn9zeK!|E057(pWveqSSpAZ<_D-t@G!vtx{qw98}O=UP2Kv z?KUL$>nZP<1vhi&j^$;YK6>`!*@}_YoDIzrUsHcV8~u2MpZ*E*QOU7TjrrnOW{Q${ zeQS%zk!L2jyS?B|QKcwpR1wQv98mV~H2dY)qk3#a4)dW?j}_}u(YD3kwE5^;hVEMP zvXyjyDnD>7c`7hu(^{QTcAwRL55kAMyV|68Sq=CvooZ9}^h2IHu2EpMYIP*DI6whJzE#e8 zxb#F!PKGDFGj;bf+C`g%S#;{?E{0;;OQ1LZN&c;`YnTp}$y*$gCp>s91#KUEwqWR9 ztW2fqpT>41o=CZhG4LXXbMmK1?I$&>>?$&Q{89;@hUeZDeylIZUY)Wg$$t}6wuM(7 zv*O=QG*w)5GB-1;=YxBqhYV4B4t7ZdfT z#H#%rDDtUaIlv`$6;+ESypT_OC@nOUG!bLn>92%|DV+_f>O(qm!%i3ac$I1tTZvK> zXC$Lnhb};36n@+LbvyU9Nohe_M#wR9>R5q-zR?5E1e!gu^l-P&9)ozT-dy9xsmEG& z27*DOs&MY?BHz%ia7z8Y_uWDG9j}KM>Xqm57rQJFoz|(W&7gZu;+aX7PObKlGlpi<1%(#ayvgm$ z1^IEY&TgK@E9cPy-+b38!Ag|9uQNI#iDqa(^_etW%oWr;SCQ`7 zoZW1?DxQ%)ze`q4P3CUeV1d6W$F}67x3*G)M(HUthR3)juPkB=+B?yt8AEGxr7Xvk zF^?m882p`&;mmkv#~3@IihT?iG0$!NOC1w}czJTdNx3@F6W4`ZIVd+#6j6ufilcef zwERSc6S~U5M} z>B30+4S${4vG7Tgpg_|?4Nvv2>3Z$BJ}m$9Nydzkyw9`f9sS6@GIxsWk + + + + + + + + +
+ + + + + + + + + + + + + +
+

+The XenoServer project aims to build a public infrastructure for wide-area distributed computing. +

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Overview
+The Xenoserver project is building a public infrastructure for wide-area distributed computing. We envisage a world in which Xenoserver execution platforms will be scattered across the globe and available for any member of the public to submit code for execution. Crucially, the sponsor of the code will be billed for all the resources used or reserved during the course of execution. This will serve to encourage load balancing, limit congestion, and hopefully even make the platform self-financing. +

+A global infrastructure such as we propose is essential to address the fundamental problem of communication latency. By enabling principles to run programs at points throughout the network they can ensure that their code executes close to the entities with which it needs to interact. As well as reducing latency this can be used to avoid network bottlenecks, to reduce long-haul network charges and to provide a platform over which code provided by transiently-connected mobile devices can maintain a network presence. +

+Our approach is distinguished from existing work on mobile agents, execution platforms, code hosting and the like by two principles: +

+Tackling difficult problems at the same time. Acceptable designs for execution environments, resource management, resource discovery, authentication, privacy, charging, billing, payment and auditing are all crucial to the success of our platform as an infrastructure service open to and accepted by the public. Existing work has tackled individual subsets of these problems, but tensions between the issues concerned mean that solutions proficient in some dimension are lacking in another. +

+No brave new world. Our platform will host applications written in today's programming languages against existing APIs -- and, we believe, those written with tomorrow's languages and libraries. We do not want to mandate a particular code distribution format or a particular middleware toolkit for distributed programming. +

+ Project Overview Document
+
+
+ diff --git a/tools/control/web/tmpl/dom-del.tmpl b/tools/control/web/tmpl/dom-del.tmpl new file mode 100644 index 0000000000..1c71fba836 --- /dev/null +++ b/tools/control/web/tmpl/dom-del.tmpl @@ -0,0 +1,86 @@ +Delete Domain +SECTION&XenoServers +BREADCRUMB&Domain Manager&dom.jsp + + + + + + +INCLUDE&dommenu.tmpl + + +
+ +
+ + + + +##WHITESPACE## ##GREYLINE1## ##WHITESPACE## + + + +##WHITESPACE## ##GREYLINE1## ##WHITESPACE## + + + + + +
+<% + CommandList command_list = new CommandList(); + Defaults d = sc.getDefaults(); + Domain domains[] = command_list.executeCommand(d); +%> + + + + + <% + for (int loop = 0; loop < domains.length; loop++) + { + %> + + + + + + + + + + + <% + } + %> + + +
domain
id
processorhas
cpu
statemcu
advance
total
pages
name
<%= domains[loop].id %><%= domains[loop].processor %><%= domains[loop].cpu %> <%= domains[loop].state %> <%= domains[loop].mcu %> <%= domains[loop].pages %> <%= domains[loop].name %>
+
+ + + + + + + + + + + + + + + + +
don't force
force
+
+
+ +
+ + + + + diff --git a/tools/control/web/tmpl/dom-delr.tmpl b/tools/control/web/tmpl/dom-delr.tmpl new file mode 100644 index 0000000000..0693570f7a --- /dev/null +++ b/tools/control/web/tmpl/dom-delr.tmpl @@ -0,0 +1,42 @@ +Delete Domain +SECTION&XenoServers +BREADCRUMB&Domain Manager&dom.jsp + + + + + + +INCLUDE&dommenu.tmpl + + +
+ + +Delete Domain Results +
+ +<% + HttpServletRequestWrapper hsrw = new HttpServletRequestWrapper(request); + Defaults d = sc.getDefaults(); + CommandDestroy command_destroy = new CommandDestroy(); + + String domains[] = hsrw.getParameterValues("dom"); + boolean force = hsrw.getParameter("force").equals("true"); + + for (int i = 0; i < domains.length; i++) + { +%> +result <%= domains[i] %> = + <%= command_destroy.executeCommand(d, Integer.parseInt(domains[i]), + force) %>
+<% + } +%> + +
+ + + + + diff --git a/tools/control/web/tmpl/dom-lis.tmpl b/tools/control/web/tmpl/dom-lis.tmpl new file mode 100644 index 0000000000..7a479a0f87 --- /dev/null +++ b/tools/control/web/tmpl/dom-lis.tmpl @@ -0,0 +1,50 @@ +Domain List +SECTION&XenoServers +BREADCRUMB&Domain Manager&dom.jsp + + + + + + +INCLUDE&dommenu.tmpl + + +
+ +<% + CommandList command_list = new CommandList(); + Defaults d = sc.getDefaults(); + Domain domains[] = command_list.executeCommand(d); +%> + + + + + <% + /* assert: domains != null, otherwise, where is the servlet engine? */ + for (int loop = 0; loop < domains.length; loop++) + { + %> + + + + + + + + + + <% + } + %> + +
domain
id
processorhas
cpu
statemcu
advance
total
pages
name
<%= domains[loop].id %><%= domains[loop].processor %><%= domains[loop].cpu %> <%= domains[loop].state %> <%= domains[loop].mcu %> <%= domains[loop].pages %> <%= domains[loop].name %>
+ + +
+ + + + + diff --git a/tools/control/web/tmpl/dom-new.tmpl b/tools/control/web/tmpl/dom-new.tmpl new file mode 100644 index 0000000000..f6af5e570b --- /dev/null +++ b/tools/control/web/tmpl/dom-new.tmpl @@ -0,0 +1,197 @@ +Create New Domain +SECTION&XenoServers +BREADCRUMB&Domain Manager&dom.jsp + + + + + + +INCLUDE&dommenu.tmpl + + +
+ +
+ + + + + + + + + + + + + + + +##WHITESPACE## ##GREYLINE14## ##WHITESPACE## + +<% + Defaults d = sc.getDefaults(); + + if (d == null) + { +%> + ACK Defaults IS NULL +<% + } +%> + + + + + + + + + + +##WHITESPACE## ##GREYLINE14## ##WHITESPACE## + + + + + + + + + + +##WHITESPACE## ##GREYLINE14## ##WHITESPACE## + + + + + + + + + + + + +##WHITESPACE## ##GREYLINE14## ##WHITESPACE## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +##WHITESPACE## ##GREYLINE14## ##WHITESPACE## + + + + + + +##WHITESPACE## + + + + + + + + + + + + + + + ##WHITESPACE## + + + + + + + + ##WHITESPACE## + + + + + + + + + + + + + + + +##WHITESPACE## ##GREYLINE14## ##WHITESPACE## + + + + + + + + + + + + + +##WHITESPACE## ##GREYLINE14## ##WHITESPACE## + + + + + + + +
Create A New Domain
Domain Name
+
Memory Size
+ KB +
Kernel Image
path + +
IP Config
VIFs + +
IP address
Gateway
Netmask
Root File System
NFSpath + +
server + +
ramdiskpath + +
physical diskpath
virtual diskpath
Extra Arguments
+
+ +
+ + + + + diff --git a/tools/control/web/tmpl/dom-newr.tmpl b/tools/control/web/tmpl/dom-newr.tmpl new file mode 100644 index 0000000000..2800eac702 --- /dev/null +++ b/tools/control/web/tmpl/dom-newr.tmpl @@ -0,0 +1,100 @@ +Create New Domain +SECTION&XenoServers +BREADCRUMB&Domain Manager&dom.jsp + + + + + + +INCLUDE&dommenu.tmpl + + +
+ +Create Domain Results +
+ +<% + HttpServletRequestWrapper hsrw = new HttpServletRequestWrapper(request); + Defaults d = sc.getDefaults(); + CommandNew command_new = new CommandNew(); + String root_device = hsrw.getParameter("root"); + + String nfsroot = null; + String nfsserver = null; + String rd = null; + String disk = null; + + if (root_device.equals("nfs")) + { + nfsroot = hsrw.getParameter("nfsroot"); + nfsserver = hsrw.getParameter("nfsserver"); + disk = "/dev/nfs"; + } + else if (root_device.equals("ram")) + { + nfsserver = hsrw.getParameter("nfsserver"); + rd = hsrw.getParameter("rd"); + } + else if (root_device.equals("pdisk")) + { + nfsserver = hsrw.getParameter("nfsserver"); + disk = hsrw.getParameter("pdisk"); + } + else if (root_device.equals("vdisk")) + { + nfsserver = hsrw.getParameter("nfsserver"); + disk = hsrw.getParameter("vdisk"); + } + +%> +name = <%= hsrw.getParameter("name") %> +
+size = <%= hsrw.getParameter("size") %> +
+image = <%= hsrw.getParameter("image") %> +
+initrd = <%= rd %> +
+vifs = <%= hsrw.getParameter("vifs") %> +
+bargs = <%= hsrw.getParameter("args") %> +
+nfs_root_path = <%= nfsroot %> +
+nw_ip = <%= hsrw.getParameter("ip") %> +
+nw_gw = <%= hsrw.getParameter("gw") %> +
+nw_mask = <%= hsrw.getParameter("mask") %> +
+nw_nfs_server = <%= nfsserver %> +
+nw_host = <%= hsrw.getParameter("hostname") %> +
+root = <%= disk %> +
+output =
<%= + command_new.executeCommand(d, + hsrw.getParameter("name"), + Integer.parseInt(hsrw.getParameter("size")), + hsrw.getParameter("image"), + rd, + Integer.parseInt(hsrw.getParameter("vifs")), + hsrw.getParameter("args"), + disk, + nfsroot, + hsrw.getParameter("ip"), + hsrw.getParameter("gw"), + hsrw.getParameter("mask"), + nfsserver, + hsrw.getParameter("hostname")) +%> + +
+ + + + + diff --git a/tools/control/web/tmpl/dom-sta.tmpl b/tools/control/web/tmpl/dom-sta.tmpl new file mode 100644 index 0000000000..06fda1a96a --- /dev/null +++ b/tools/control/web/tmpl/dom-sta.tmpl @@ -0,0 +1,64 @@ +Start Domain +SECTION&XenoServers +BREADCRUMB&Domain Manager&dom.jsp + + + + + + +INCLUDE&dommenu.tmpl + + +
+ +
+ + + + +##WHITESPACE## ##GREYLINE1## ##WHITESPACE## + + + + + +
+<% + CommandList command_list = new CommandList(); + Defaults d = sc.getDefaults(); + Domain domains[] = command_list.executeCommand(d); +%> + + + + + <% + for (int loop = 0; loop < domains.length; loop++) + { + %> + + + + + + + + + + + <% + } + %> + + +
domain
id
processorhas
cpu
statemcu
advance
total
pages
name
<%= domains[loop].id %><%= domains[loop].processor %><%= domains[loop].cpu %> <%= domains[loop].state %> <%= domains[loop].mcu %> <%= domains[loop].pages %> <%= domains[loop].name %>
+
+
+ +
+ + + + + diff --git a/tools/control/web/tmpl/dom-star.tmpl b/tools/control/web/tmpl/dom-star.tmpl new file mode 100644 index 0000000000..cd7e27abd4 --- /dev/null +++ b/tools/control/web/tmpl/dom-star.tmpl @@ -0,0 +1,40 @@ +Start Domain +SECTION&XenoServers +BREADCRUMB&Domain Manager&dom.jsp + + + + + + +INCLUDE&dommenu.tmpl + + +
+ + +Start Domain Results +
+ +<% + HttpServletRequestWrapper hsrw = new HttpServletRequestWrapper(request); + Defaults d = sc.getDefaults(); + CommandStart command_start = new CommandStart(); + + String domains[] = hsrw.getParameterValues("dom"); + + for (int i = 0; i < domains.length; i++) + { +%> +result <%= domains[i] %> = + <%= command_start.executeCommand(d, Integer.parseInt(domains[i])) %>
+<% + } +%> + +
+ + + + + diff --git a/tools/control/web/tmpl/dom-stp.tmpl b/tools/control/web/tmpl/dom-stp.tmpl new file mode 100644 index 0000000000..8587a5a594 --- /dev/null +++ b/tools/control/web/tmpl/dom-stp.tmpl @@ -0,0 +1,64 @@ +Stop Domain +SECTION&XenoServers +BREADCRUMB&Domain Manager&dom.jsp + + + + + + +INCLUDE&dommenu.tmpl + + +
+ +
+ + + + +##WHITESPACE## ##GREYLINE1## ##WHITESPACE## + + + + + +
+<% + CommandList command_list = new CommandList(); + Defaults d = sc.getDefaults(); + Domain domains[] = command_list.executeCommand(d); +%> + + + + + <% + for (int loop = 0; loop < domains.length; loop++) + { + %> + + + + + + + + + + + <% + } + %> + + +
domain
id
processorhas
cpu
statemcu
advance
total
pages
name
<%= domains[loop].id %><%= domains[loop].processor %><%= domains[loop].cpu %> <%= domains[loop].state %> <%= domains[loop].mcu %> <%= domains[loop].pages %> <%= domains[loop].name %>
+
+
+ +
+ + + + + diff --git a/tools/control/web/tmpl/dom-stpr.tmpl b/tools/control/web/tmpl/dom-stpr.tmpl new file mode 100644 index 0000000000..8c0016e89b --- /dev/null +++ b/tools/control/web/tmpl/dom-stpr.tmpl @@ -0,0 +1,40 @@ +Stop Domain +SECTION&XenoServers +BREADCRUMB&Domain Manager&dom.jsp + + + + + + +INCLUDE&dommenu.tmpl + + +
+ + +Stop Domain Results +
+ +<% + HttpServletRequestWrapper hsrw = new HttpServletRequestWrapper(request); + Defaults d = sc.getDefaults(); + CommandStop command_stop = new CommandStop(); + + String domains[] = hsrw.getParameterValues("dom"); + + for (int i = 0; i < domains.length; i++) + { +%> +result <%= domains[i] %> = + <%= command_stop.executeCommand(d, Integer.parseInt(domains[i])) %>
+<% + } +%> + +
+ + + + + diff --git a/tools/control/web/tmpl/dom.tmpl b/tools/control/web/tmpl/dom.tmpl new file mode 100644 index 0000000000..6e602c979f --- /dev/null +++ b/tools/control/web/tmpl/dom.tmpl @@ -0,0 +1,30 @@ +Domain Manager +SECTION&XenoServers + + + + + + +INCLUDE&dommenu.tmpl + + +
+ + +<% + Defaults d = sc.getDefaults(); +%> + + + + +
Domain Manager
+
+ + + + + diff --git a/tools/control/web/tmpl/dommenu.tmpl b/tools/control/web/tmpl/dommenu.tmpl new file mode 100644 index 0000000000..8fc11b2276 --- /dev/null +++ b/tools/control/web/tmpl/dommenu.tmpl @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +
List
New
Start
Stop
Delete
+ + + + + + + diff --git a/tools/control/web/tmpl/help.tmpl b/tools/control/web/tmpl/help.tmpl new file mode 100644 index 0000000000..9cf6462273 --- /dev/null +++ b/tools/control/web/tmpl/help.tmpl @@ -0,0 +1,61 @@ +Help +SECTION&XenoServers + + + + + + + + + + +
+ + + + + + + + + + + + + +
+

+The XenoServer project aims to build a public infrastructure for wide-area distributed computing. +

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
+ Help +
Some help text will go here. +
+
+ diff --git a/tools/control/web/tmpl/index.tmpl b/tools/control/web/tmpl/index.tmpl new file mode 100644 index 0000000000..d1e158ff48 --- /dev/null +++ b/tools/control/web/tmpl/index.tmpl @@ -0,0 +1,66 @@ +XenoServers +COPYRIGHT&Computer Laboratory, University of Cambridge + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+

+ The XenoServer project aims to build a public infrastructure + for wide-area distributed computing. +

+
+ + + + + + + + +##WHITESPACE## ##GREYLINE1## ##WHITESPACE## + + + + + +##WHITESPACE## ##GREYLINE1## ##WHITESPACE## + + + + + + +##WHITESPACE## +
+ About the XenoServers Project
+
+ Domain Manager
+ Virtual Disk Manager
+
+ For additional information, click + here +
+
+ diff --git a/tools/control/web/tmpl/install.pl b/tools/control/web/tmpl/install.pl new file mode 100755 index 0000000000..1d712a2e39 --- /dev/null +++ b/tools/control/web/tmpl/install.pl @@ -0,0 +1,236 @@ +#!/usr/bin/perl5 +if($#ARGV<0) { + &usage(); +} else { + + $headerfile = "xenohead.def" ; + $footerfile = "xenofoot.def" ; + + $sectionbreak = "-" ; + $supress_section = 0 ; + $homepage = 0 ; + $navigationwidth = 106; + $navigationstring = "\"XenoServers"; + $whitespace = ""; + $greyline1 = ""; + $greyline2 = ""; + $greyline3 = ""; + $greyline4 = ""; + $greyline14 = ""; + + + $login = getlogin || (getpwuid($<))[0] || "an unidentified user" ; + + $name =`finger $login | sed -n "s/Login.*:.*: //p"` ; + if( $name eq "" ) { $name = $login ; } + + $date = `date +"on %-e-%b-%Y at %H:%M"` ; + + $year = `date +"%Y"` ; + + foreach $ag (@ARGV) { + + if( $ag =~ "^-s" ) { + $supress_section = 1 ; + } + elsif( $ag =~ "^-home" ) { + $homepage = 1 ; + } + else { + + $preagtmp = $ag . ".tmpl~$$"; + $agtmp = $ag . ".jsp~$$"; + + open(PRETMPL,">$preagtmp") or die "Unable to write $preagtmp\n"; + print PRETMPL &doIncludes("$ag.tmpl"); + close(PRETMPL); + + open(TMPL,"<$preagtmp") or die "Unable to read $preagtmp\n"; + + open(HTML,">$agtmp") or die "Unable to open $agtmp\n" ; + + $title= ; + + $sectionhead = "XenoServers" ; + $copyright = "Computer Laboratory, University of Cambridge" ; + $breadcrumbline = "" ; + $commentcontact="pagemaster\@cl.cam.ac.uk" ; + + $process_headings = 1 ; + $tmp= ; + while( $process_headings ) { + $process_headings = 0 ; + + if( $tmp =~ /^SECTION&(.*)$/ ) { + $sectionhead=$1 ; + $process_headings = 1 ; + } + + if( $tmp =~ /^COMMENTS&(.*)$/ ) { + $commentcontact=$1 ; + $process_headings = 1 ; + } + + if( $tmp =~ /^COPYRIGHT&(.*)$/ ) { + $copyright=$1 ; + $process_headings = 1 ; + } + + if( $tmp =~ /^HEADERFILE&(.*)$/ ) { + $headerfile=$1 ; + $process_headings = 1 ; + } + + if( $tmp =~ /^FOOTERFILE&(.*)$/ ) { + $footerfile=$1 ; + $process_headings = 1 ; + } + + if( $tmp =~ /BREADCRUMB&.*/ ) { + @bread=split(/&/,$tmp) ; + @bwords=split(/ /, @bread[1]) ; + $bname=@bwords[0] ; + for( $i=1 ; $i <= $#bwords ; $i++ ){ + $bname = $bname . " " . @bwords[$i] ; + } + $breadcrumbline = $breadcrumbline . " > " . $bname . "" ; + $process_headings = 1 ; + } + + if( $process_headings ) { + $tmp= ; + } + } + +#### generate the final breadcrumb which is the current file itself + @path=split(/\//, $ag) ; + $localfilename=@path[$#path] . ".jsp" ; + @bwords=split(/ /, $title) ; + $bname=@bwords[0] ; + for( $i=1 ; $i <= $#bwords ; $i++ ){ + $bname = $bname . " " . @bwords[$i] ; + } + $breadcrumbline = $breadcrumbline . " > " . $bname . "" ; + + +#### if suppressing the section header then do so now + if( $supress_section ) { + $sectionhead = "" ; + $sectionbreak = "" ; + } + +#### if homepage then do so now + if( $homepage ) { + $breadcrumbline = "" ; + $navigationwidth = 53; + $navigationstring = ""; + } + + + open(HEADER,"<$headerfile") or die "Unable to open $headerfile\n" ; + while(
) { + s/##TITLE##/$title/g ; + s/##SECTION##/$sectionhead/g ; + s/##SECTIONBREAK##/$sectionbreak/g ; + s/##BREADCRUMBS##/$breadcrumbline/g ; + s/##FILENAME##/$ag.jsp/g ; + s/##DATE##/$date/g ; + s/##OWNERNAME##/$name/g ; + s/##OWNERUSERID##/$login/g ; + s/##OWNEREMAIL##/$login\@cl.cam.ac.uk/g ; + s/##COMMENTCONTACT##/$commentcontact/g ; + s/##COPYRIGHT##/$copyright/g ; + s/##YEAR##/$year/g ; + s/##NAVIGATIONWIDTH##/$navigationwidth/g ; + s/##NAVIGATIONSTRING##/$navigationstring/g ; + print HTML $_ ; + } + close(HEADER) ; + + $_ = $tmp ; + while(defined($_)) { + s/##LISTSTART##/
    /g ; + s/##ITEMHEAD##/
  • /g ; + s/##ITEMBODY##/
    /g ; + s|##LISTEND##|
|g ; + s/##TITLE##/$title/g ; + s/##SECTION##/$sectionhead/g ; + s/##BREADCRUMBS##/$breadcrumbline/g ; + s/##FILENAME##/$ag.jsp/g ; + s/##DATE##/$date/g ; + s/##OWNERNAME##/$name/g ; + s/##OWNERUSERID##/$login/g ; + s/##OWNEREMAIL##/$login\@cl.cam.ac.uk/g ; + s/##COMMENTCONTACT##/$commentcontact/g ; + s/##COPYRIGHT##/$copyright/g ; + s/##YEAR##/$year/g ; + s/##WHITESPACE##/$whitespace/g ; + s/##GREYLINE1##/$greyline1/g ; + s/##GREYLINE2##/$greyline2/g ; + s/##GREYLINE3##/$greyline3/g ; + s/##GREYLINE4##/$greyline4/g ; + s/##GREYLINE14##/$greyline14/g ; + print HTML $_ ; + $_ = + } + open(FOOTER,"<$footerfile") or die "Unable to open $footerfile\n" ; + while(